import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.*;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@Slf4j
public class HttpClientUtils {
/**
* 套接字超时时间
*/
private static final int SOCKET_TIME_OUT = 10 * 1000;
/**
* 连接超时时间
*/
private static final int CONNECT_TIME_OUT = 15 * 1000;
/**
* httpClient客户端
*/
private static volatile CloseableHttpClient httpClient = null;
/**
* MIMETYPE_JSON
*/
public static final String MIMETYPE_JSON = "application/json";
/**
* MIMETYPE_FORM
*/
public static final String MIMETYPE_FORM = "application/x-www-form-urlencoded";
/**
* POST_HEADER_KEY
*/
private static final String POST_HEADER_KEY = "User-Agent";
/**
* POST_HEADER_VALUE
*/
private static final String POST_HEADER_VALUE = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36";
/**
* 字符编码
*/
private static final String CHART_SET = "utf-8";
/**
* 请求成功状态
*/
private static final Integer SUCCESS_CODE = 200;
/**
* 返回单例CloseableHttpClient
*
* @return CloseableHttpClient
*/
public static CloseableHttpClient httpClient() {
if (httpClient == null) {
synchronized (HttpClientUtils.class) {
if (httpClient == null) {
RequestConfig defaultRequestConfig = RequestConfig.custom().setConnectTimeout(CONNECT_TIME_OUT)
.setSocketTimeout(SOCKET_TIME_OUT).build(); //超时时间单位为毫秒
httpClient = HttpClients.custom().setDefaultRequestConfig(defaultRequestConfig).build();
}
}
}
return httpClient;
}
/**
* 以get的方式获取response
*
* @param requst httpGet
* @return CloseableHttpResponse
*/
public static CloseableHttpResponse submit(HttpUriRequest requst) throws Exception {
return httpClient().execute(requst);
}
/**
* 执行请求获取返回数据
*
* @param request
* @return
*/
public static String execute(HttpUriRequest request) throws Exception {
CloseableHttpResponse response = httpClient().execute(request);
//获取实体
HttpEntity entity = response.getEntity();
//将实体装成字符串
String html = EntityUtils.toString(entity);
EntityUtils.consume(entity);
response.close();
return html;
}
/**
* 创建HttpGet
*
* @param url 链接
* @return HttpGet
*/
public static HttpGet createHttpGet(String url) {
HttpGet httpGet = new HttpGet(url);
httpGet.addHeader(POST_HEADER_KEY, POST_HEADER_VALUE);
return httpGet;
}
/**
* 创建HttpPost带请求参数
*
* @param url 链接
* @param params 参数
* @param mimeType 格式
* @return HttpPost
*/
public static HttpPost createHttpPost(String url, Map<String, Object> params, String mimeType) throws Exception {
HttpPost post = createHttpPost(url);
if (params != null) {
HttpEntity entity;
if (MIMETYPE_FORM.equals(mimeType)) {
entity = new UrlEncodedFormEntity(createParam(params), CHART_SET);
} else {
String jsonParams = JSON.toJSONString(params);
entity = new StringEntity((jsonParams), mimeType, CHART_SET);
}
post.setEntity(entity);
}
return post;
}
/**
* 创建HttpPost
*
* @param url 链接
* @return HttpPost
*/
public static HttpPost createHttpPost(String url) {
HttpPost post = new HttpPost(url);
post.addHeader(POST_HEADER_KEY, POST_HEADER_VALUE);
return post;
}
/**
* 创建HttpPut
*
* @param url 链接
* @return HttpPost
*/
public static HttpPut createHttpPut(String url) {
HttpPut put = new HttpPut(url);
put.addHeader(POST_HEADER_KEY, POST_HEADER_VALUE);
return put;
}
/**
* 创建HttpDelete
*
* @param url 链接
* @return HttpDelete
*/
public static HttpDelete createHttpDelete(String url) {
HttpDelete httpDelete = new HttpDelete(url);
httpDelete.addHeader(POST_HEADER_KEY, POST_HEADER_VALUE);
return httpDelete;
}
/**
* 创建HttpPost带请求参数
*
* @param request 请求
* @param params 参数
* @param mimeType 格式
*/
public static void setParam(HttpEntityEnclosingRequestBase request, Map<String, Object> params, String mimeType) throws Exception {
if (params != null) {
HttpEntity entity;
if (MIMETYPE_FORM.equals(mimeType)) {
entity = new UrlEncodedFormEntity(createParam(params), CHART_SET);
} else {
String jsonParams = JSON.toJSONString(params);
entity = new StringEntity((jsonParams), mimeType, CHART_SET);
}
request.setEntity(entity);
}
}
/**
* 生成NameValuePair
*
* @param param 参数
* @return List<NameValuePair>
*/
public static List<NameValuePair> createParam(Map<String, Object> param) {
List<NameValuePair> nvps = new ArrayList<NameValuePair>();
if (param != null) {
for (String k : param.keySet()) {
nvps.add(new BasicNameValuePair(k, param.get(k).toString()));
}
}
return nvps;
}
}