工作中难免会用httpclien进行数据的跨系统传输,这几天老在用,调别的系统的接口,今天就给大家分享出来我用的工具类吧,主要是后期我用的时候可以找到。
package com.cnlive.shenhe.utils;
import com.alibaba.fastjson.JSONObject;
import org.apache.http.Header;
import org.apache.http.HttpEntity;
import org.apache.http.HttpStatus;
import org.apache.http.NameValuePair;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.config.RequestConfig.Builder;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.entity.mime.content.FileBody;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.message.BasicHeader;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.nio.charset.UnsupportedCharsetException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
/**
* http请求工具类
*
* @author liujiong
*/
public class HttpUtil {
private Logger logger = LoggerFactory.getLogger(HttpUtil.class);
private static PoolingHttpClientConnectionManager pcm;//httpclient连接池
private CloseableHttpClient httpClient = null; //http连接
private int connectTimeout = 120000;//连接超时时间
private int connectionRequestTimeout = 10000;//从连接池获取连接超时时间
private int socketTimeout = 300000;//获取数据超时时间
private String charset = "utf-8";
private RequestConfig requestConfig = null;//请求配置
private Builder requestConfigBuilder = null;//build requestConfig
private List nvps = new ArrayList<>();
private List headers = new ArrayList<>();
private String requestParam = "";
static {
pcm = new PoolingHttpClientConnectionManager();
pcm.setMaxTotal(50);//整个连接池最大连接数
pcm.setDefaultMaxPerRoute(50);//每路由最大连接数,默认值是2
}
/**
* 默认设置
*
* @author Liu Jiong
* @createDate 2016年10月30日
*/
private static HttpUtil defaultInit() {
HttpUtil httpUtil = new HttpUtil();
if (httpUtil.requestConfig == null) {
httpUtil.requestConfigBuilder = RequestConfig.custom().setConnectTimeout(httpUtil.connectTimeout)
.setConnectionRequestTimeout(httpUtil.connectionRequestTimeout)
.setSocketTimeout(httpUtil.socketTimeout);
httpUtil.requestConfig = httpUtil.requestConfigBuilder.build();
}
return httpUtil;
}
/**
* 初始化 httpUtil
*/
public static HttpUtil init() {
HttpUtil httpUtil = defaultInit();
if (httpUtil.httpClient == null) {
httpUtil.httpClient = HttpClients.custom().setConnectionManager(pcm).build();
}
return httpUtil;
}
/**
* 初始化 httpUtil
*/
public static HttpUtil init(Map paramMap) {
HttpUtil httpUtil = init();
httpUtil.setParamMap(paramMap);
return httpUtil;
}
/**
* 验证初始化
*/
public static HttpUtil initWithAuth(String ip, int port, String username, String password) {
HttpUtil httpUtil = defaultInit();
if (httpUtil.httpClient == null) {
CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(new AuthScope(ip, port, AuthScope.ANY_REALM), new UsernamePasswordCredentials(username, password));
httpUtil.httpClient = HttpClients.custom().setDefaultCredentialsProvider(credentialsProvider)
.setConnectionManager(pcm).build();
}
return httpUtil;
}
/**
* 设置请求头
*/
public HttpUtil setHeader(String name, String value) {
Header header = new BasicHeader(name, value);
headers.add(header);
return this;
}
/**
* 设置请求头
*/
public HttpUtil setHeaderMap(Map headerMap) {
for (Entry param : headerMap.entrySet()) {
Header header = new BasicHeader(param.getKey(), param.getValue());
headers.add(header);
}
return this;
}
/**
* 设置请求参数
*/
public HttpUtil setParam(String name, String value) {
nvps.add(new BasicNameValuePair(name, value));
return this;
}
/**
* 设置请求参数
*/
public HttpUtil setParamMap(Map paramMap) {
for (Entry param : paramMap.entrySet()) {
nvps.add(new BasicNameValuePair(param.getKey(), param.getValue()));
}
return this;
}
/**
* 设置字符串参数
*/
public HttpUtil setStringParam(String requestParam) {
this.requestParam = requestParam;
return this;
}
/**
* 设置连接超时时间
*/
public HttpUtil setConnectTimeout(int connectTimeout) {
this.connectTimeout = connectTimeout;
this.requestConfigBuilder = requestConfigBuilder.setConnectTimeout(connectTimeout);
requestConfig = requestConfigBuilder.build();
return this;
}
/**
* http get 请求
*/
public Map get(String url) {
Map resultMap = new HashMap<>();
//获取请求URI
URI uri = getUri(url);
if (uri != null) {
HttpGet httpGet = new HttpGet(uri);
httpGet.setConfig(requestConfig);
if (!CollectionUtils.isEmpty(headers)) {
Header[] header = new Header[headers.size()];
httpGet.setHeaders(headers.toArray(header));
}
//执行get请求
try {
CloseableHttpResponse response = httpClient.execute(httpGet);
return getHttpResult(response, url, httpGet, resultMap);
} catch (Exception e) {
httpGet.abort();
resultMap.put("result", e.getMessage());
logger.error("获取http GET请求返回值失败 url======" + url, e);
}
}
return resultMap;
}
/**
* http post 请求
*/
public Map post(String url) {
HttpPost httpPost = new HttpPost(url);
httpPost.setConfig(requestConfig);
if (!CollectionUtils.isEmpty(headers)) {
Header[] header = new Header[headers.size()];
httpPost.setHeaders(headers.toArray(header));
}
if (!CollectionUtils.isEmpty(nvps)) {
try {
httpPost.setEntity(new UrlEncodedFormEntity(nvps, charset));
} catch (UnsupportedEncodingException e) {
logger.error("http post entity form error", e);
}
}
if (!StringUtils.isEmpty(requestParam)) {
try {
httpPost.setEntity(new StringEntity(requestParam, charset));
} catch (UnsupportedCharsetException e) {
logger.error("http post entity form error", e);
}
}
Map resultMap = new HashMap<>();
//执行post请求
try {
CloseableHttpResponse response = httpClient.execute(httpPost);
return getHttpResult(response, url, httpPost, resultMap);
} catch (Exception e) {
httpPost.abort();
resultMap.put("result", e.getMessage());
logger.error("获取http POST请求返回值失败 url======" + url, e);
}
return resultMap;
}
/**
* post 上传文件
*/
public Map postUploadFile(String url, Map fileParam) {
HttpPost httpPost = new HttpPost(url);
httpPost.setConfig(requestConfig);
if (!CollectionUtils.isEmpty(headers)) {
Header[] header = new Header[headers.size()];
httpPost.setHeaders(headers.toArray(header));
}
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
if (fileParam != null) {
for (Entry entry : fileParam.entrySet()) {
//将要上传的文件转化为文件流
FileBody fileBody = new FileBody(entry.getValue());
//设置请求参数
builder.addPart(entry.getKey(), fileBody);
}
}
if (!CollectionUtils.isEmpty(nvps)) {
for (NameValuePair nvp : nvps) {
String value = nvp.getValue();
if (!StringUtils.isEmpty(value)) {
builder.addTextBody(nvp.getName(), value, ContentType.create("text/plain", charset));
}
}
}
httpPost.setEntity(builder.build());
Map resultMap = new HashMap<>();
//执行post请求
try {
CloseableHttpResponse response = httpClient.execute(httpPost);
return getHttpResult(response, url, httpPost, resultMap);
} catch (Exception e) {
httpPost.abort();
resultMap.put("result", e.getMessage());
logger.error("获取http postUploadFile 请求返回值失败 url======" + url, e);
}
return resultMap;
}
/**
* 获取请求返回值
*/
private Map getHttpResult(CloseableHttpResponse response, String url, HttpUriRequest request, Map resultMap) {
String result = "";
int statusCode = response.getStatusLine().getStatusCode();
resultMap.put("statusCode", statusCode + "");
HttpEntity entity = response.getEntity();
if (entity != null) {
try {
result = EntityUtils.toString(entity, charset);
EntityUtils.consume(entity);//释放连接
} catch (Exception e) {
logger.error("获取http请求返回值解析失败", e);
request.abort();
}
}
if (statusCode != 200) {
result = "HttpClient status code :" + statusCode + " request url===" + url;
logger.info("HttpClient status code :" + statusCode + " request url===" + url);
request.abort();
}
resultMap.put("result", result);
return resultMap;
}
/**
* 获取重定向url返回的location
*/
public String redirectLocation(String url) {
String location = "";
//获取请求URI
URI uri = getUri(url);
if (uri != null) {
HttpGet httpGet = new HttpGet(uri);
requestConfig = requestConfigBuilder.setRedirectsEnabled(false).build();//设置自动重定向false
httpGet.setConfig(requestConfig);
if (!CollectionUtils.isEmpty(headers)) {
Header[] header = new Header[headers.size()];
httpGet.setHeaders(headers.toArray(header));
}
try {
//执行get请求
CloseableHttpResponse response = httpClient.execute(httpGet);
int statusCode = response.getStatusLine().getStatusCode();
if (statusCode == HttpStatus.SC_MOVED_PERMANENTLY || statusCode == HttpStatus.SC_MOVED_TEMPORARILY) {//301 302
Header header = response.getFirstHeader("Location");
if (header != null) {
location = header.getValue();
}
}
HttpEntity entity = response.getEntity();
if (entity != null) {
EntityUtils.consume(entity);
}
} catch (Exception e) {
logger.error("获取http GET请求获取 302 Location失败 url======" + url, e);
httpGet.abort();
}
}
return location;
}
/**
* 获取输入流
*/
public InputStream getInputStream(String url) {
//获取请求URI
URI uri = getUri(url);
if (uri != null) {
HttpGet httpGet = new HttpGet(uri);
httpGet.setConfig(requestConfig);
if (!CollectionUtils.isEmpty(headers)) {
Header[] header = new Header[headers.size()];
httpGet.setHeaders(headers.toArray(header));
}
//执行get请求
try {
CloseableHttpResponse response = httpClient.execute(httpGet);
int statusCode = response.getStatusLine().getStatusCode();
if (statusCode != 200) {
logger.info("HttpClient status code :" + statusCode + " request url===" + url);
httpGet.abort();
} else {
HttpEntity entity = response.getEntity();
if (entity != null) {
InputStream in = entity.getContent();
return in;
}
}
} catch (Exception e) {
logger.error("获取http GET inputStream请求失败 url======" + url, e);
httpGet.abort();
}
}
return null;
}
private URI getUri(String url) {
URI uri = null;
try {
URIBuilder uriBuilder = new URIBuilder(url);
if (!CollectionUtils.isEmpty(nvps)) {
uriBuilder.setParameters(nvps);
}
uri = uriBuilder.build();
} catch (URISyntaxException e) {
logger.error("url 地址异常", e);
}
return uri;
}
/**
* from请求
* @param url
* @param params
* @return
*/
public static String form(String url, Map params) {
URL u = null;
HttpURLConnection con = null;
// 构建请求参数
StringBuffer sb = new StringBuffer();
if (params != null) {
for (Entry e : params.entrySet()) {
sb.append(e.getKey());
sb.append("=");
sb.append(e.getValue());
sb.append("&");
}
sb.substring(0, sb.length() - 1);
}
// 尝试发送请求
try {
u = new URL(url);
con = (HttpURLConnection) u.openConnection();
//// POST 只能为大写,严格限制,post会不识别
con.setRequestMethod("POST");
con.setDoOutput(true);
con.setDoInput(true);
con.setUseCaches(false);
con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
OutputStreamWriter osw = new OutputStreamWriter(con.getOutputStream(), "UTF-8");
osw.write(sb.toString());
osw.flush();
osw.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (con != null) {
con.disconnect();
}
}
// 读取返回内容
StringBuffer buffer = new StringBuffer();
try {
//一定要有返回值,否则无法把请求发送给server端。
BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream(), "UTF-8"));
String temp;
while ((temp = br.readLine()) != null) {
buffer.append(temp);
buffer.append("\n");
}
} catch (Exception e) {
e.printStackTrace();
}
return buffer.toString();
}
public static void main(String[] args) {
/*Map map = new HashMap<>();
JSONObject param = new JSONObject();
param.put("activity_id","60:video:comets:10011#2");
param.put("state",3);
param.put("attr_tags","");
param.put("msg","");
map.put("param",param.toJSONString());
String form = form("http://yp5ntd.natappfree.cc/CnInteraction/services/commentForHd/auditCallBackNew", map);
System.out.println(form);*/
JSONObject params = new JSONObject();
params.put("video_id","60_8be004799c424688949704814ea0d16d");
params.put("state",3+"");
params.put("attr_tags","");
params.put("msg","");
HttpUtil httpUtil = HttpUtil.init();
httpUtil.setParam("param",params.toJSONString());
String URL ="http://abcd.com/v1/ShenHeInfo/shenheNotify?platform=AUDIT&token=94cead75c";
Map post = httpUtil.post(URL);
System.out.println(post.get("result"));
}
}