package com.neusoft.common.utils;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpDelete;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.mime.HttpMultipartMode;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.entity.mime.content.ContentBody;
import org.apache.http.entity.mime.content.StringBody;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URI;
import java.nio.charset.Charset;
import java.util.List;
import java.util.Map;
@Slf4j
public class HttpClientUtil {
/**
* 通过httpClient发送get请求
* @param url
* @param params
* @return
* @throws IOException
*/
public static String sendGetRequest(String url, Map<String,Object> headers,Map<String,Object> params) throws IOException {
//创建HttpClient对象
HttpClient httpClient = HttpClients.createDefault();
HttpGet httpGet = new HttpGet();
// 设置请求头
httpGet.addHeader("Accept", "application/json");
httpGet.addHeader("Connection", "keep-alive");
httpGet.addHeader("Content-Type", "application/json; charset=utf-8");
for (String key : headers.keySet()) {
httpGet.addHeader(key,String.valueOf(headers.get(key)));
}
// 设置参数
if (params != null && params.size() > 0) {
StringBuilder newUrl = new StringBuilder(url + "?");
params.forEach((k, v) -> newUrl.append(k).append("=").append(v).append("&"));
httpGet.setURI(URI.create(newUrl.toString()));
}
String response;
try {
HttpResponse execute = httpClient.execute(httpGet);
// 获取响应实体
HttpEntity responseEntity = execute.getEntity();
response = responseEntity != null ? EntityUtils.toString(responseEntity, "UTF-8") : "响应结果为null";
} catch (IOException e) {
throw new RuntimeException(e);
}
log.info("{}的GET请求结果为:{}",url,response);
return response;
}
/**
* 通过httpClient发送post请求
* @param url
* @param headerParams
* @param requestBodyParams
* @param files
* @return
* @throws IOException
*/
public static String sendPostRequest(String url,
Map<String,Object> headerParams,
Map<String,Map<String,Object>> requestBodyParams,
Map<String,File> files) throws IOException {
//创建HttpClient对象
HttpClient httpClient = HttpClients.createDefault();
//创建HttpPost对象
HttpPost httpPost = new HttpPost(url);
//设置请求头信息
httpPost.addHeader("Accept", "application/json");
httpPost.addHeader("Connection", "keep-alive");
httpPost.addHeader("Expect", "100-continue");
if(headerParams!=null && CollectionUtils.isNotEmpty(headerParams.keySet())) {
for (String key : headerParams.keySet()) {
httpPost.setHeader(key, String.valueOf(headerParams.get(key)));
}
}
// 设置请求体
ContentType contentType = ContentType.create("multipart/form-data", Charset.forName("UTF-8"));
MultipartEntityBuilder builder = MultipartEntityBuilder.create().setMode(HttpMultipartMode.RFC6532)
.setCharset(Charset.forName("UTF-8"))
.setContentType(contentType);
if(files!=null && CollectionUtils.isNotEmpty(files.keySet())){
for (String fileName : files.keySet()) {
builder.addBinaryBody("file", toByteArray(files.get(fileName)), ContentType.MULTIPART_FORM_DATA, fileName);
}
}
if(requestBodyParams!=null && CollectionUtils.isNotEmpty(requestBodyParams.keySet())) {
for (String keyName : requestBodyParams.keySet()) {
if(requestBodyParams.get(keyName)!=null &&
CollectionUtils.isNotEmpty(requestBodyParams.get(keyName).keySet())){
for (String dateType : requestBodyParams.get(keyName).keySet()) {
Object obj = requestBodyParams.get(keyName).get(dateType);
switch (dateType){
case "string":
// 添加字符串参数
builder.addTextBody(keyName, String.valueOf(obj), ContentType.MULTIPART_FORM_DATA);
break;
case "object":
ContentBody contentBody = new StringBody(String.valueOf(obj), ContentType.APPLICATION_JSON);
// 添加对象参数
builder.addPart(keyName, contentBody);
break;
case "array":
JSONArray jsonArray = new JSONArray(String.valueOf(obj));
for (Object objTemp : jsonArray) {
JSONObject jsonObject = new JSONObject(String.valueOf(objTemp));
for (String objKey : jsonObject.keySet()) {
Object oj = jsonObject.get(objKey);
if(oj instanceof String){
builder.addTextBody(objKey, String.valueOf(oj), ContentType.MULTIPART_FORM_DATA);
}else if(oj instanceof JSONObject){
ContentBody contentBody2 = new StringBody(String.valueOf(oj), ContentType.APPLICATION_JSON);
// 添加对象参数
builder.addPart(objKey, contentBody2);
}
}
}
}
}
}
}
}
HttpEntity multipart = builder.build();
// 将参数设置到HttpPost对象中
httpPost.setEntity(multipart);
log.info("{}请求的body信息:{}",url,multipart);
try {
//执行请求
HttpResponse response = httpClient.execute(httpPost);
//获取响应结果
HttpEntity responseEntity = response.getEntity();
String responseString = EntityUtils.toString(responseEntity, "UTF-8");
log.info("{}的POST请求结果为:{}",url,response);
return responseString;
} catch (IOException e) {
log.error("url:{},请求异常{}:",url,e.getMessage());
e.printStackTrace();
} finally {
try {
} catch (Exception e) {
e.printStackTrace();
}
}
return "error";
}
/**
* delete请求
* @param url
* @return
*/
public static String sendDeleteRequest(String url,Map<String,Object> headerParams){
CloseableHttpClient httpClient = HttpClients.createDefault();
try {
// 创建HttpDelete对象,设置URI
HttpDelete httpDelete = new HttpDelete(url);
// 设置请求头
for (String key : headerParams.keySet()) {
httpDelete.setHeader(key,String.valueOf(headerParams.get(key)));
}
// 执行请求
CloseableHttpResponse response = httpClient.execute(httpDelete);
try {
// 获取响应实体
String responseBody = EntityUtils.toString(response.getEntity());
log.info("{}请求的结果为:{}",url,responseBody);
return responseBody;
} finally {
// 关闭响应对象
response.close();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
// 关闭HttpClient实例
httpClient.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return "error";
}
public static byte[] toByteArray(File file) throws IOException {
FileInputStream fis = null;
try {
fis = new FileInputStream(file);
byte[] bytes = new byte[(int) file.length()];
fis.read(bytes);
return bytes;
} finally {
if (fis != null) {
fis.close();
}
}
}
}
httpClient请求
小小小猿阿2024-07-05 23:42