要使用MultipartEntityBuilder,先引入maven
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpmime</artifactId>
<version>4.5</version>
</dependency>
Java用httpclient(apache)完整的纯文本form-data请求实现如下:
public enum Test {
;
private static final Logger logger = LoggerFactory.getLogger(Test.class);
/**
* setConnectTimeout: 从客户端到url建立连接的超时时间
*/
private static final int CONNECT_TIMEOUT = 30 * 1000;
/**
* setSocketTimeout: 连接上一个url后,获取response的返回等待时间
*/
private static final int SOCKET_TIMEOUT = 3600 * 1000;
public static JSONObject postHttpFormDataPair(String URL, JSONObject requestBodyJson, Map<String, String> headersMap, String... saveRespHeaderName){
RequestConfig requestConfig = RequestConfig.custom()
.setConnectTimeout(CONNECT_TIMEOUT)
.setSocketTimeout(SOCKET_TIMEOUT)
.setCookieSpec(CookieSpecs.DEFAULT)
.build();
CookieStore cookieStore = new BasicCookieStore();
// 默认是 CloseableHttpClient httpClient = HttpClientBuilder.create().build();
try (CloseableHttpClient httpClient = createSSLClientDefaultBuilder()
.setDefaultRequestConfig(requestConfig)
.setDefaultCookieStore(cookieStore)
.build()) {
HttpPost post = new HttpPost(URL);
// [重要]:生成边界分隔符 boundary
String boundary = new UUIDGenerator().next();
// [重要]:设置请求格式 multipart/form-data
post.addHeader("Content-type", "multipart/form-data; charset=UTF-8; boundary=" + boundary);
post.addHeader("Accept", "*/*");
post.addHeader("Accept-Encoding", "UTF-8");
post.addHeader("User-Agent", " Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36");
if (!CollectionUtils.isEmpty(headersMap)) {
for (Map.Entry<String, String> entry : headersMap.entrySet()) {
post.addHeader(entry.getKey(), entry.getValue());
}
}
// 构造 formdata 请求数据
MultipartEntityBuilder multipartEntityBuilder = MultipartEntityBuilder.create()
.setCharset(StandardCharsets.UTF_8)
// [重要]:设置 setBoundary 边界分隔符
.setBoundary(boundary);
multipartEntityBuilder.addTextBody("a", "aaa");
multipartEntityBuilder.addTextBody("b", "bbb");
HttpEntity postFormDataBody = multipartEntityBuilder.build();
// 请求参数
post.setEntity(postFormDataBody);
// 发送 post 请求
HttpResponse response = httpClient.execute(post);
if (response == null) {
thrownew RuntimeException("response is null");
} elseif (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
return getResponseJsonObject(response, saveRespHeaderName);
} else {
logger.warn("response status is not 200");
return getResponseJsonObject(response, saveRespHeaderName);
}
} catch (Exception ex) {
logger.error("error:", ex);
thrownew RuntimeException("系统异常");
}
}
@NotNull
privatestatic JSONObject getResponseJsonObject(HttpResponse response, String[] saveRespHeaderName)throws IOException {
InputStream in = response.getEntity().getContent();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
String lines;
StringBuilder responseMsg = new StringBuilder("");
while ((lines = reader.readLine()) != null) {
lines = new String(lines.getBytes(), StandardCharsets.UTF_8);
responseMsg.append(lines);
}
reader.close();
in.close();
JSONObject jsonObject = new JSONObject();
jsonObject.put("message", responseMsg.toString());
// save header
for (String name : saveRespHeaderName) {
jsonObject.put(name, response.getHeaders(name));
}
return jsonObject;
}
/**
* 绕过https证书校验
*/
publicstatic HttpClientBuilder createSSLClientDefaultBuilder(){
HttpClientBuilder httpClientBuilder = null;
try {
SSLContextBuilder builder = new SSLContextBuilder();
// 实现该接口,证书受信任的X509证书校验为true
builder.loadTrustMaterial(null, (chain, authType) -> true);
// 创建HttpsURLConnection对象,并设置其SSLSocketFactory对象
SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory(builder.build(), new String[]{"TLSv1.2"}, null, NoopHostnameVerifier.INSTANCE);
// HttpsURLConnection对象就可以正常连接HTTPS了,无论其证书是否经权威机构的验证,只要实现了接口X509TrustManager的类MyX509TrustManager信任该证书。
httpClientBuilder = HttpClients.custom().setSSLSocketFactory(socketFactory);
} catch (Exception e) {
e.printStackTrace();
thrownew RuntimeException("系统异常");
}
return httpClientBuilder;
}
}