背景
项目一般的远程服务调用使用feign,由于feign调用对于StandardMultipartHttpServletRequest支持不是很友好,所以需要将其改造为rest或者是http,相比与rest,http更为友好。
服务提供方
@PostMapping("/updateInfo")
@NonNull
public TransResult updateInfo(@RequestParam("Id") String Id,
@RequestParam("info") String info, String language,
StandardMultipartHttpServletRequest request) {
//.................
}
服务调用方
@RequestMapping("updateInfo")
public GlobalResponse updateInfo(@RequestParam("Id") String Id,@RequestParam("info") String info,@RequestParam("file") MultipartFile file) throws IOException {
//定义post请求
HttpPost post = new HttpPost(path + "/xxx/api/updateInfo");
CloseableHttpClient httpClient = HttpClients.createDefault();
CloseableHttpResponse response = null;
RequestConfig config = RequestConfig.custom().setConnectTimeout(30000).setSocketTimeout(30000).build();
String result = "";
//构建请求
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.setMode(HttpMultipartMode.RFC6532);
builder.setContentType(ContentType.MULTIPART_FORM_DATA);
if (file != null) {
builder.addBinaryBody("file",new FileInputStream(multipartFileToFile(file)),ContentType.DEFAULT_BINARY,file.getOriginalFilename());
}
builder.addTextBody("Id", Id,ContentType.create(HTTP.PLAIN_TEXT_TYPE,HTTP.UTF_8));
builder.addTextBody("info",info, ContentType.create(HTTP.PLAIN_TEXT_TYPE,HTTP.UTF_8));
builder.addTextBody("language","zh", ContentType.create(HTTP.PLAIN_TEXT_TYPE,HTTP.UTF_8));
post.setConfig(config);
post.setEntity(builder.build());
//执行请求
response = httpClient.execute(post);
HttpEntity entity = response.getEntity();
result = httpEntityToString(entity);
JSONObject json = JSON.parseObject(result);
JSONObject data = JSON.parseObject(json.getString("data"));
return GlobalResponse.success(data);
}
完美解决调用问题。