Java项目
依赖
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpmime</artifactId>
<version>4.5.14</version>
</dependency>
请求方法:
public static String doPostFormData(String apiUrl, Map<String, Object> paramMap) {
HttpPost httpPost = new HttpPost(apiUrl);
httpPost.setHeader("Content-Type", MediaType.MULTIPART_FORM_DATA);
// 文件流参数配置
if (MapUtils.isNotEmpty(paramMap)) {
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.setCharset(StandardCharsets.UTF_8);
builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
for (Map.Entry<String, Object> entry : paramMap.entrySet()) {
Object value = entry.getValue();
System.err.println(entry.getKey());
if (value instanceof File) {
// 文件流
FileBody fileBody = new FileBody((File) value, ContentType.DEFAULT_BINARY);
builder.addPart(entry.getKey(), fileBody);
} else {
StringBody stringBody = new StringBody(value.toString(), ContentType.TEXT_PLAIN);
builder.addPart(entry.getKey(), stringBody);
}
}
HttpEntity entity = builder.build();
httpPost.setEntity(entity);
}
RequestConfig requestConfig = RequestConfig.custom()
.setConnectTimeout(120000)
.setConnectionRequestTimeout(120000)
.setSocketTimeout(120000)
.build();
httpPost.setConfig(requestConfig);
HttpResponse response = null;
try {
CloseableHttpClient httpClient = HttpClientBuilder.create().build();
response = httpClient.execute(httpPost);
} catch (IOException e) {
throw new RuntimeException(e);
}
String result = null;
int statusCode = response.getStatusLine().getStatusCode();
if (statusCode == HttpStatus.SC_OK) {
HttpEntity responseEntity = response.getEntity();
if (responseEntity != null) {
try {
result = EntityUtils.toString(responseEntity);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
return result;
}
这个方法post请求到服务器会产生入参为 null 的情况
解决方案
删除
httpPost.setHeader("Content-Type", MediaType.MULTIPART_FORM_DATA);
这行 Content-Type 请求头配置。之所以不用设置请求头类型是因为
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
MultipartEntityBuilder 会自动构建请求体,不需要自己再手动设置。如果一定要自己手动设置 Content-Type 的话那就得同时把 boundary 也手动设置好,例如:
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.setCharset(StandardCharsets.UTF_8);
builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
builder.setBoundary("----------------" + System.currentTimeMillis());