先说下背景:我最近负责的项目,需要调用第三方接口,发送 get/post/put/delete 请求,这些请求有的需要经过 digest 认证,有的则不需要进行 digest 认证,直接请求就可以了
get 请求还好说一些,直接使用 hutool 工具类中的 get 请求就可以满足需要,那你可能会说, hutool 工具类也支持 post 请求呀,但是如果我的 post 请求需要以 form-data 形式提交,它就不满足了,而且 hutool 工具类也不支持发送 put/delete 请求
所以我就自己写了个工具类,不过我写的这个比较粗糙,放在这里,有需要的人看着拿吧~回头我有时间的话,就再优化一下:
public class HttpUtils {
/**
* 以 post 方式调用第三方接口,以 form-data 形式 发送 MultipartFile 文件数据
*
* @param url post请求url
* @param fileParamName 文件参数名称
* @param multipartFile 文件
* @param paramMap 表单里其他参数
* @return
*/
public static String doPostFormData(String url, String fileParamName, MultipartFile multipartFile, Map<String, String> paramMap) {
// 创建 Http 实例
CloseableHttpClient httpClient = HttpClients.createDefault();
// 创建 HttpPost 实例
HttpPost httpPost = new HttpPost(url);
// 请求参数配置
RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(60000).setConnectTimeout(60000)
.setConnectionRequestTimeout(10000).build();
httpPost.setConfig(requestConfig);
try {
MultipartEntityBuilder builder = MultipartEntityBuilder.create()
.setCharset(Consts.UTF_8);
builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
// 设置 content-type
builder.setContentType(ContentType.MULTIPART_FORM_DATA);
builder.setCharset(StandardCharsets.UTF_8);
// 待上传文件
FormBodyPart part = FormBodyPartBuilder.create()
.setName(fileParamName)
.setBody(new ByteArrayBody(
multipartFile.getBytes(),
ContentType.create(multipartFile.getContentType(), StandardCharsets.UTF_8),
multipartFile.getOriginalFilename()))
.build();
builder.addPart(part);
// 表单中其他参数
if(paramMap != null) {
for (Map.Entry<String, String> entry : paramMap.entrySet()) {
builder.addPart(FormBodyPartBuilder.create()
.setName(entry.getKey())
.setBody(new StringBody(entry.getValue(),
ContentType.create(
ContentType.TEXT_PLAIN.getMimeType(),
StandardCharsets.UTF_8)))
.build());
}
}
HttpEntity entity = builder.build();
httpPost.setEntity(entity);
// 执行提交
HttpResponse response = httpClient.execute(httpPost);
if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
// 返回
String res = EntityUtils.toString(response.getEntity(), java.nio.charset.Charset.forName("UTF-8"));
return res;
}else {
HttpEntity responseEntity = response.getEntity();
byte[] msg = new byte[(int) responseEntity.getContentLength()];
responseEntity.getContent()