在平时工作中,我们经常会有请求接口的需求,抽时间总结了一下供大家参考。
依赖包:
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5</version>
</dependency>
工具类文件:
package com.rz.util;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.SocketTimeoutException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.ParseException;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.entity.UrlEncodedFormEntity;
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.client.methods.HttpPut;
import org.apache.http.client.utils.URLEncodedUtils;
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 org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.alibaba.fastjson.JSONObject;
/**
* HTTP客户端帮助类
*/
public class HttpClientUtil {
private static final Logger LOG = LoggerFactory.getLogger(HttpClientUtil.class);
public static final String CHAR_SET = "UTF-8";
private static CloseableHttpClient httpClient;
private static int socketTimeout = 30000;
private static int connectTimeout = 30000;
private static int connectionRequestTimeout = 30000;
// 配置总体最大连接池(maxConnTotal)和单个路由连接最大数(maxConnPerRoute),默认是(20,2)
private static int maxConnTotal = 200; // 最大不要超过1000
private static int maxConnPerRoute = 100;// 实际的单个连接池大小,如tps定为50,那就配置50
static {
RequestConfig config = RequestConfig.custom()
.setSocketTimeout(socketTimeout)
.setConnectTimeout(connectTimeout)
.setConnectionRequestTimeout(connectionRequestTimeout).build();
httpClient = HttpClients.custom().setDefaultRequestConfig(config)
.setMaxConnTotal(maxConnTotal)
.setMaxConnPerRoute(maxConnPerRoute).build();
}
public static CloseableHttpClient getClient() {
return httpClient;
}
public static String get(String url) {
try {
return get(url, null, null);
} catch (IOException e) {
LOG.error("HttpClientUtil.get()报错:", e);
}
return null;
}
public static String get(String url, Map<String, String> map) {
try {
return get(url, map, null);
} catch (IOException e) {
LOG.error("HttpClientUtil.get()报错:", e);
}
return null;
}
public static String get(String url, String charset) {
try {
return get(url, null, charset);
} catch (IOException e) {
LOG.error("HttpClientUtil.get()报错:", e);
}
return null;
}
public static String get(String url, Map<String, String> paramsMap, String charset) throws IOException {
if ( StringUtils.isBlank(url) ) {
return null;
}
charset = (charset == null ? CHAR_SET : charset);
if (null != paramsMap && !paramsMap.isEmpty()) {
List<NameValuePair> params = new ArrayList<NameValuePair>();
for (Map.Entry<String, String> map : paramsMap.entrySet()) {
params.add(new BasicNameValuePair(map.getKey(), map.getValue()));
}
//GET方式URL参数编码
String querystring = URLEncodedUtils.format(params, charset);
if(StringUtils.contains(url, "?")) {
url += "&" + querystring;
} else {
url += "?" + querystring;
}
}
HttpGet httpGet = new HttpGet(url);
httpGet.addHeader("Accept-Encoding", "*");
CloseableHttpResponse response = null;
try {
response = getClient().execute(httpGet);
} catch (SocketTimeoutException e) {
LOG.error("请求超时,1秒后将重试1次:"+ url, e);
try {
Thread.sleep(1000);
} catch (InterruptedException e1) { }
response = getClient().execute(httpGet);
}
// 状态不为200的异常处理。
return EntityUtils.toString(response.getEntity(), charset);
}
/**
* 提供返回json结果的get请求(ESG专用)
* @param url
* @param charset
* @return
* @throws IOException */
public static String getResponseJson(String url, Map<String, String> map) {
try {
return getResponseJson(url, map, null);
} catch (IOException e) {
LOG.error("HttpClientUtil.getResponseJson()报错:", e);
}
return null;
}
public static String getResponseJson(String url, Map<String, String> paramsMap, String charset) throws IOException {
if ( StringUtils.isBlank(url) ) {
return null;
}
charset = (charset == null ? CHAR_SET : charset);
if (null != paramsMap && !paramsMap.isEmpty()) {
List<NameValuePair> params = new ArrayList<NameValuePair>();
for (Map.Entry<String, String> map : paramsMap.entrySet()) {
params.add(new BasicNameValuePair(map.getKey(), map.getValue()));
}
//GET方式URL参数编码
String querystring = URLEncodedUtils.format(params, charset);
if(StringUtils.contains(url, "?")) {
url += "&" + querystring;
} else {
url += "?" + querystring;
}
}
HttpGet httpGet = new HttpGet(url);
httpGet.addHeader("Accept-Encoding", "*");
httpGet.addHeader("Accept", "application/json;charset=UTF-8");
CloseableHttpResponse response = null;
try {
response = getClient().execute(httpGet);
} catch (SocketTimeoutException e) {
// LOG.error("请求超时,1秒后将重试1次:"+ url, e);
LOG.error(e.getMessage()+ "请求超时,1秒后将重试1次:"+ url);
try {
Thread.sleep(1000);
} catch (InterruptedException e1) { }
response = getClient().execute(httpGet);
}
// 状态不为200的异常处理。
return EntityUtils.toString(response.getEntity(), charset);
}
public static String delete(String url, Map<String, String> paramsMap, String charset) throws IOException {
if ( StringUtils.isBlank(url) ) {
return null;
}
charset = (charset == null ? CHAR_SET : charset);
if (null != paramsMap && !paramsMap.isEmpty()) {
List<NameValuePair> params = new ArrayList<NameValuePair>();
for (Map.Entry<String, String> map : paramsMap.entrySet()) {
params.add(new BasicNameValuePair(map.getKey(), map.getValue()));
}
//GET方式URL参数编码
String querystring = URLEncodedUtils.format(params, charset);
if(StringUtils.contains(url, "?")) {
url += "&" + querystring;
} else {
url += "?" + querystring;
}
}
HttpDelete httpDelete = new HttpDelete(url);
httpDelete.addHeader("Accept-Encoding", "*");
CloseableHttpResponse response = getClient().execute(httpDelete);
// 状态不为200的异常处理。
return EntityUtils.toString(response.getEntity(), charset);
}
public static String post(String url, String request) {
return post(url, request, null);
}
public static String post(String url, String request, String charset) {
if ( StringUtils.isBlank(url) ) {
return null;
}
String res = null;
CloseableHttpResponse response = null;
try {
charset = (charset == null ? CHAR_SET : charset);
StringEntity entity = new StringEntity(request, charset);
HttpPost httpPost = new HttpPost(url);
httpPost.addHeader("Content-Type", "application/json;charset=utf-8");
httpPost.addHeader("Accept-Encoding", "*");
httpPost.setEntity(entity);
try {
response = getClient().execute(httpPost);
} catch (SocketTimeoutException e) {
LOG.error("请求超时,1秒后将重试1次:"+ url, e);
try {
Thread.sleep(1000);
} catch (InterruptedException e1) { }
response = getClient().execute(httpPost);
}
res = EntityUtils.toString(response.getEntity());
// 状态不为200的异常处理。
} catch (ParseException e) {
LOG.error("HTTP Post(), ParseException: ", e);
} catch (IOException e) {
LOG.error("HTTP Post(), IOException: ", e);
} finally {
if (response != null) {
try {
response.close();
} catch (IOException e) {
}
}
}
return res;
}
public static String post(String url, Map<String, String> map) {
return post(url, map, null);
}
public static String post(String url, Map<String, String> paramsMap, String charset) {
if ( StringUtils.isBlank(url) ) {
return null;
}
String res = null;
CloseableHttpResponse response = null;
try {
charset = (charset == null ? CHAR_SET : charset);
List<NameValuePair> params = new ArrayList<NameValuePair>();
for (Map.Entry<String, String> map : paramsMap.entrySet()) {
params.add(new BasicNameValuePair(map.getKey(), map.getValue()));
}
UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(params, charset);
HttpPost httpPost = new HttpPost(url);
httpPost.addHeader("Accept-Encoding", "*");
httpPost.setEntity(formEntity);
try {
response = getClient().execute(httpPost);
} catch (SocketTimeoutException e) {
LOG.error("请求超时,1秒后将重试1次:"+ url, e);
try {
Thread.sleep(1000);
} catch (InterruptedException e1) { }
response = getClient().execute(httpPost);
}
res = EntityUtils.toString(response.getEntity());
// 状态不为200的异常处理。
if (response.getStatusLine().getStatusCode() != 200) {
throw new IOException(res);
}
} catch (IOException e) {
LOG.error("HTTP Post(), IOException: ", e);
} finally {
if (response != null) {
try {
response.close();
} catch (IOException e) {
}
}
}
return res;
}
/**
* 提供返回json结果的post请求
* @param url
* @param map
* @param charset
* @return json
* @throws IOException */
public static String postResponseJson(String url, Map<String, String> map) {
return postResponseJson(url, map, null);
}
/**
* Put方式提交
* @param url
* @param paramsMap
* @param charset
* @return response.getEntity() */
public static String postResponseJson(String url, Map<String, String> paramsMap, String charset) {
if ( StringUtils.isBlank(url) ) {
return null;
}
String res = null;
CloseableHttpResponse response = null;
try {
charset = (charset == null ? CHAR_SET : charset);
List<NameValuePair> params = new ArrayList<NameValuePair>();
for (Map.Entry<String, String> map : paramsMap.entrySet()) {
params.add(new BasicNameValuePair(map.getKey(), map.getValue()));
}
UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(params, charset);
//解决url中的一些特殊字符
URI uri = null;
HttpPost httpPost = null;
try {
URL url2 = new URL(url);
uri = new URI(url2.getProtocol(), url2.getUserInfo(), url2.getHost(), url2.getPort(), url2.getPath(), url2.getQuery(), null);
} catch (URISyntaxException e) {
LOG.error("URL中存在非法编码:"+ url, e);
uri = null;
}
if(uri != null) {
httpPost = new HttpPost( uri );
} else {
httpPost = new HttpPost( url );
}
httpPost.addHeader("Accept-Encoding", "*");
httpPost.addHeader("Accept", "application/json;charset=UTF-8");
httpPost.setEntity(formEntity);
try {
response = getClient().execute(httpPost);
} catch (SocketTimeoutException e) {
// LOG.error("请求超时,1秒后将重试1次:"+ url, e);
LOG.error(e.getMessage()+ "请求超时,1秒后将重试1次:"+ url);
try {
Thread.sleep(1000);
} catch (InterruptedException e1) { }
response = getClient().execute(httpPost);
}
res = EntityUtils.toString(response.getEntity());
// 状态不为200的异常处理。
if (response.getStatusLine().getStatusCode() != 200) {
throw new IOException(res);
}
} catch (IOException e) {
LOG.error("postResponseJson方法报错: ", e);
} finally {
if (response != null) {
try {
response.close();
} catch (IOException e) {
}
}
}
return res;
}
/**
* Put方式提交
* @param url
* @param paramsMap
* @param charset
* @return response.getEntity() */
public static String put(String url, Map<String, String> paramsMap, String charset) {
if ( StringUtils.isBlank(url) ) {
return null;
}
String res = null;
CloseableHttpResponse response = null;
try {
charset = (charset == null ? CHAR_SET : charset);
List<NameValuePair> params = new ArrayList<NameValuePair>();
for (Map.Entry<String, String> map : paramsMap.entrySet()) {
params.add(new BasicNameValuePair(map.getKey(), map.getValue()));
}
UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(params, charset);
HttpPut httpPut = new HttpPut(url);
httpPut.addHeader("Accept-Encoding", "*");
httpPut.setEntity(formEntity);
try {
response = getClient().execute(httpPut);
} catch (SocketTimeoutException e) {
LOG.error("请求超时,1秒后将重试1次:"+ url, e);
try {
Thread.sleep(1000);
} catch (InterruptedException e1) { }
response = getClient().execute(httpPut);
}
res = EntityUtils.toString(response.getEntity());
// 状态不为200的异常处理。
if (response.getStatusLine().getStatusCode() != 200) {
throw new IOException(res);
}
} catch (IOException e) {
LOG.error("HTTP put(), IOException: ", e);
} finally {
if (response != null) {
try {
response.close();
} catch (IOException e) {
}
}
}
return res;
}
/**
* Titel 提交HTTP请求,获得响应(application/x-www-form-urlencoded) Description
* 使用NameValuePair封装参数,适用于下载文件。
* @param serviceURI : 接口地址
* @param timeOut : 超时时间
* @param params : 请求参数
* @param charset : 参数编码
* @return CloseableHttpResponse */
public static CloseableHttpResponse submitPostHttpReq(final String serviceURI, final int timeOut,
final Map<String, String> pmap, final String charset) {
CloseableHttpResponse response = null;
LOG.info("即将发起HTTP请求!serviceURI:" + serviceURI);
// 遍历封装参数
List<NameValuePair> formParams = new ArrayList<NameValuePair>();
for (String key : pmap.keySet()) {
NameValuePair pair = new BasicNameValuePair(key, pmap.get(key));
formParams.add(pair);
}
// 转换为from Entity
UrlEncodedFormEntity fromEntity = null;
try {
fromEntity = new UrlEncodedFormEntity(formParams, CHAR_SET);
} catch (UnsupportedEncodingException e) {
LOG.error("创建UrlEncodedFormEntity异常,编码问题: " + e.getMessage());
return null;
}
// 创建http post请求
HttpPost httpPost = new HttpPost(serviceURI);
httpPost.setEntity(fromEntity);
// 设置请求和传输超时时间
RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(timeOut).setConnectTimeout(timeOut).build();
httpPost.setConfig(requestConfig);
// 提交请求、获取响应
LOG.info("提交http请求!serviceURI:" + serviceURI);
CloseableHttpClient httpclient = HttpClients.createDefault();
try {
response = httpclient.execute(httpPost);
} catch (SocketTimeoutException e) {
LOG.error("请求超时,1秒后将重试1次:"+ serviceURI, e);
try {
Thread.sleep(1000);
response = httpclient.execute(httpPost);
} catch (Exception e1) {
LOG.error("超时后再次请求报错:", e);
response = null;
}
} catch (IOException e) {
LOG.error("httpclient.execute异常!" + e.getMessage());
response = null;
}
LOG.info("提交http请求!serviceURI:" + serviceURI);
return response;
}
public static int getSocketTimeout() {
return socketTimeout;
}
public static void setSocketTimeout(int socketTimeout) {
HttpClientUtil.socketTimeout = socketTimeout;
}
public static int getConnectTimeout() {
return connectTimeout;
}
public static void setConnectTimeout(int connectTimeout) {
HttpClientUtil.connectTimeout = connectTimeout;
}
public static int getConnectionRequestTimeout() {
return connectionRequestTimeout;
}
public static void setConnectionRequestTimeout(int connectionRequestTimeout) {
HttpClientUtil.connectionRequestTimeout = connectionRequestTimeout;
}
/**
* 请求josn串,返回josn对象
* */
public static JSONObject doPost(String url, String jsonStr) {
HttpPost post = new HttpPost(url);
JSONObject response = null;
try {
StringEntity s = new StringEntity(jsonStr,"UTF-8");
s.setContentType("application/json");// 发送json数据需要设置contentType
post.setEntity(s);
HttpResponse res = getClient().execute(post);
if (res.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
String result = EntityUtils.toString(res.getEntity());// 返回json格式:
response = JSONObject.parseObject(result);
}
} catch (Exception e) {
throw new RuntimeException(e);
}
return response;
}
}
完