http请求调用的参数同时包含流文件和普通参数的处理方法
在项目中,如果要进行第三方对接,或者使用第三方的接口时,我们可能就需要使用http来调用了,可是有时候传参时,同时有流文件和普通参数时,我们如果直接把他们全当成一样的无差别的来传递时,对方可能会接收不到正确的参数,此时,可以用以下更原生的方法:
public String submitPost(String url, Map<String, String> params, MultipartFile multipartFile, String fileParamName) throws WarningMessageException {
CloseableHttpClient httpclient = HttpClientBuilder.create().build();
try {
HttpPost httppost = new HttpPost(url);
File file = new File(Objects.requireNonNull(multipartFile.getOriginalFilename()));
//将multipartFile转file
FileUtils.copyInputStreamToFile(multipartFile.getInputStream(), file);
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
ContentType contentType = ContentType.create(ContentType.TEXT_PLAIN.getMimeType(), StandardCharsets.UTF_8);
builder.addBinaryBody(fileParamName, file);
if (MapUtils.isNotEmpty(params)) {
Set<String> keys = params.keySet();
for (String key : keys) {
builder.addTextBody(key, params.get(key), contentType);
}
}
httppost.setEntity(builder.build());
HttpResponse response = httpclient.execute(httppost);
int statusCode = response.getStatusLine().getStatusCode();
if (statusCode == HttpStatus.SC_OK) {
System.out.println("服务器正常响应.....");
HttpEntity resEntity = response.getEntity();
return EntityUtils.toString(resEntity);
} else {
logger.error("请求失败,响应码:" + statusCode);
}
} catch (Exception e) {
throw new HintMessageException(e);
}
return null;
}
其中fileParamName是流的参数名称的key, params是普通参数的键值对。
若为MultipartFile类型,则将其转成File类型的copyInputStreamToFile()方法如下:
public static void copyInputStreamToFile(InputStream source, File destination) throws IOException {
try {
FileOutputStream output = openOutputStream(destination);
try {
IOUtils.copy(source, output);
output.close();
} finally {
IOUtils.closeQuietly(output);
}
} finally {
IOUtils.closeQuietly(source);
}
}