在工作上遇到这样一个需求,就是调用我们公司的AI平台,将图片文件发送给他们,他们进行解析然后返回解析结果。
首先用python进行调用一次,发送捕获的接口是这样的:
那么用java代码该如何组装这个请求发送过去呢?
public static<T> String sendPostWithFile(String url, Map<String,String> head, Map<String,T> body, File file) throws IOException {
HttpHeaders requestHeaders = new HttpHeaders();
requestHeaders.setAcceptCharset(Arrays.asList(Charset.forName("UTF-8")));
head.forEach((k,v)->{
requestHeaders.add(k,v);
});
requestHeaders.setContentType(MediaType.MULTIPART_FORM_DATA);
MultiValueMap<String, Object> params = new LinkedMultiValueMap<>();
body.forEach((k,v)->{
params.add(k,v);
});
if(file != null && file.exists()){
MultiValueMap<String, String> fileMap = new LinkedMultiValueMap<>();
ContentDisposition contentDisposition = ContentDisposition
.builder("form-data")
.name(file.getPath())
.filename(file.getName())
.build();
fileMap.add(HttpHeaders.CONTENT_DISPOSITION,contentDisposition.toString());
byte[] fileContent = readContentIntoByteArray(file); //获取文件的字节流
HttpEntity<byte[]> fileEntity = new HttpEntity<>(fileContent, fileMap);
params.add(contentDisposition.toString(),fileEntity);
}
HttpEntity<MultiValueMap<String, Object>> httpEntity = new HttpEntity<>(params, requestHeaders);
HttpComponentsClientHttpRequestFactory httpRequestFactory = new HttpComponentsClientHttpRequestFactory();
httpRequestFactory.setConnectionRequestTimeout(30000);
httpRequestFactory.setConnectTimeout(30000);
httpRequestFactory.setReadTimeout(30000);
RestTemplate restTemplate = new RestTemplate(httpRequestFactory);
List<HttpMessageConverter<?>> converters = restTemplate.getMessageConverters();
converters.removeIf(httpMessageConverter -> httpMessageConverter instanceof StringHttpMessageConverter);
converters.add(0, new StringHttpMessageConverter(StandardCharsets.UTF_8));
String res = restTemplate.postForObject(url, httpEntity, String.class);
log.info("请求返回结果:"+res);
return res;
}
1.设置请求头,并且设置ContentType为multipart/form-data形式的。
2.组装请求体。
3.将文件处理好后,增加到请求体中。
4.发送请求。
这里有一个问题就是,我调用的这个接口返回的中文是unicode编码的,目前还在赵原因,在此先做一个记录。后续找到原因会补充在评论下。