缘由:因为对接方说使用from表单提交会比json提交在数据量大的情况下更效率,所以虽然是两个后台项目对接也还是选择了from表单提交。因为这样的关系,就要添加一个HTTPUtils的模拟From表单提交方法。在网上找了很久发现很多不适用,不然就是年代久远的方法。现在自己完成后记录一下。
主要思路:
通过
MultipartEntityBuilder multipartEntityBuilder = MultipartEntityBuilder.create();
生成HttpEntity,然后再设置到HttpPost中。具体实现如下
代码展示
httpPostForm
/**
* 模拟from表单提交
*
* @param url url地址
* @param paramList 参数
* @param headers 请求头
* @return
*/
public static JSONObject httpPostForm(String url, HttpEntity httpEntity , Map<String, String> headers) {
// post请求返回结果
CloseableHttpClient httpClient = HttpClients.createDefault();
JSONObject jsonResult = null;
HttpPost httpPost = new HttpPost(url);
// 设置请求和传输超时时间
RequestConfig requestConfig = RequestConfig.custom()
.setSocketTimeout(10000).setConnectTimeout(10000).build();
httpPost.setConfig(requestConfig);
if (!headers.isEmpty()) {
for (Map.Entry<String, String> entry : headers.entrySet()) {
httpPost.setHeader(entry.getKey(), entry.getValue());
}
}
try {
if (null != paramList ) {
// 解决中文乱码问题
httpPost.setEntity(paramList);
}
CloseableHttpResponse result = httpClient.execute(httpPost);
String resultString = EntityUtils.toString(result.getEntity(), "utf-8");
logger.info(result);
//请求发送成功,并得到响应
try {
//把json字符串转换成json对象
jsonResult = JSONObject.parseObject(resultString);
} catch (Exception e) {
logger.error("post请求提交失败:" + url, e);
}
} catch (IOException e) {
logger.error("post请求提交失败:" + url, e);
} finally {
httpPost.releaseConnection();
}
return jsonResult;
}
参数调用方式
MultipartEntityBuilder multipartEntityBuilder = MultipartEntityBuilder.create();
//当需要传入list结构的表单数据的时候直接重名即可,如下面的“to”
multipartEntityBuilder.addPart("to", new StringBody("A", ContentType.TEXT_PLAIN));
multipartEntityBuilder.addPart("to", new StringBody("B", ContentType.TEXT_PLAIN));
multipartEntityBuilder.addPart("cc", new StringBody("C", ContentType.TEXT_PLAIN));
HttpEntity build = multipartEntityBuilder.build();
JSONObject jsonObject = HttpUtil.httpPostForm( "www.baidu.com", build, header);
结语
如果有更好的方式欢迎留言沟通一起进步成长,有错误的地方也麻烦指出,谢谢大佬支持~