对HttpClient类使用的封装,方便使用,每个方法都写了注释,看着注释使用即可
封装的目的:包括访问页面或者支付支付、微信支付等api接口都是http/https请求,调用这些api的核心就是使用http/https请求,所有将这些请求封装方便使用
设置的参数可以针对各自的项目自行修改(直接用也可以,可以满足普通项目需求)
不对的地方请各位指正
简要说一下HttpClient使用的步骤(代码里也有注释),其实很简单:
创建Http请求实例 → 设置参数信息 → 执行请求并接收响应信息→ 处理响应信息
→ 释放资源
package com.guxing.util;
import net.sf.json.JSONObject;
import org.apache.commons.lang.StringUtils;
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.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
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 javax.net.ssl.*;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ConnectException;
import java.net.URL;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* 对http/https操作的封装,HttpClient的版本4.5.3
* Created by qsh on 17/2/16.
*/
public class HttpClientUtil {
private static final Logger logger = LoggerFactory.getLogger(HttpClientUtil.class);
private static CloseableHttpClient httpClient = null;
public static final String CHARSET = "UTF-8";
public static final String METHOD_GET = "GET";
public static final String METHOD_POST = "POST";
static {
/**
* 请求参数配置
* connectionRequestTimeout: 单位:毫秒
* 从连接池中获取连接的超时时间,超过该时间未拿到可用连接,
* 会抛出org.apache.http.conn.ConnectionPoolTimeoutException: Timeout waiting for connection from pool
* connectTimeout: 单位:毫秒
* 连接上服务器(握手成功)的时间,超出该时间抛出connect timeout
* socketTimeout: 单位:毫秒
* 服务器返回数据(response)的时间,超过该时间抛出read timeout
*/
httpClient = HttpClients.custom().setDefaultRequestConfig(RequestConfig.custom()
.setConnectionRequestTimeout(2000).setConnectTimeout(2000).setSocketTimeout(2000).build()).build();
}
/**
* 发送Http get请求
* 如果url是拼接好参数的, 那么params设为null
*
* @param url 请求的url地址 ?之前的地址 eg:http://www.baidu.com
* @param params 请求的参数
* @return
*/
public static final String doGet(String url, Map params) {
return doGet(url, params, CHARSET);
}
/**
* 发送Http post请求
* @param url
* @param params
* @return
*/
public static final String doPost(String url, Map params) {
return doPost(url, params, CHARSET);
}
/**
* 发送Http post请求
* @param url
* @param params JSON 或者 XML 字符串
* @return
*/
public static final String doPost(String url, String params) {
return doPost(url, params, CHARSET);
}
public static final String doGet(String url, Map params, String charset) {
if (StringUtils.isBlank(url)) {
// url为空, 返回null
return null;
}
try {
/*
* 参数处理 拼接参数到url
*/
if (params != null && !params.isEmpty()) {
List pairs = new ArrayList(params.size());
for (Map.Entry entry : params.entrySet()) {
String value = entry.getValue();
if (value != null) {
pairs.add(new BasicNameValuePair(entry.getKey(), value));
}
}
url += "?" + EntityUtils.toString(new UrlEncodedFormEntity(pairs, charset));
}
HttpGet httpGet = new HttpGet(url);
// 执行http get请求
CloseableHttpResponse response = httpClient.execute(httpGet);
// 返回码校验
int statusCode = response.getStatusLine().getStatusCode();
if (statusCode != 200) {
httpGet.abort();
// logger.error("http请求".concat(url).concat("失败,error status code :").concat(String.valueOf(statusCode)));
logger.error("http请求{}失败, error status code : {}", url, statusCode);
}
/*
* 读取响应结果
*/
HttpEntity entity = response.getEntity();
String result = null;
if (entity != null) {
result = EntityUtils.toString(entity, "utf-8");
}
/*
* 释放资源
*/
EntityUtils.consume(entity);
response.close();
return result;
} catch (Exception e) {
logger.error("url : {} http client request exception:{}", url, e);
}
return null;
}
public static final String doPost(String url, Map params, String charset) {
if (StringUtils.isBlank(url)) {
return null;
}
try {
List pairs = null;
if (params != null && !params.isEmpty()) {
pairs = new ArrayList(params.size());
for (Map.Entry entry : params.entrySet()) {
String value = entry.getValue();
if (value != null) {
pairs.add(new BasicNameValuePair(entry.getKey(), value));
}
}
}
HttpPost httpPost = new HttpPost(url);
if (pairs != null && pairs.size() > 0) {
httpPost.setEntity(new UrlEncodedFormEntity(pairs, charset));
}
CloseableHttpResponse response = httpClient.execute(httpPost);
int statusCode = response.getStatusLine().getStatusCode();
if (statusCode != 200) {
httpPost.abort();
logger.error("http请求{}失败, error status code : {}", url, statusCode);
}
HttpEntity entity = response.getEntity();
String result = null;
if (entity != null) {
result = EntityUtils.toString(entity, "utf-8");
}
EntityUtils.consume(entity);
response.close();
return result;
} catch (Exception e) {
logger.error("url : {} http client request exception:{}", url, e);
}
return null;
}
public static final String doPost(String url, String params, String charset) {
if (StringUtils.isBlank(url)) {
return null;
}
try {
HttpPost httpPost = new HttpPost(url);
StringEntity reqEntity = new StringEntity(params, charset);
httpPost.setEntity(reqEntity);
CloseableHttpResponse response = httpClient.execute(httpPost);
int statusCode = response.getStatusLine().getStatusCode();
if (statusCode != 200) {
httpPost.abort();
logger.error("http请求{}失败, error status code : {}", url, statusCode);
}
HttpEntity entity = response.getEntity();
String result = null;
if (entity != null) {
result = EntityUtils.toString(entity, "utf-8");
}
EntityUtils.consume(entity);
response.close();
return result;
} catch (Exception e) {
logger.error("url : {} http client request exception:{}", url, e);
}
return null;
}
/**
* 发送https请求
* 此处的返回值类型可以根据项目情况来定,也可以直接返回String类型
* @param requestUrl
* 请求地址
* @param requestMethod
* 请求方式(GET、POST)HttpClientUtil.METHOD_GET, HttpClientUtil.METHOD_POST
* @param paramStr
* 提交的数据: JsonStr或者XMLStr
* @return JSONObject (通过JSONObject.get(key)的方式获取json对象的属性值)
*/
public static final JSONObject httpsRequest(String requestUrl,
String requestMethod, String paramStr) {
JSONObject jsonObject = null;
try {
// 创建SSLContext对象,并使用我们指定的信任管理器初始化
TrustManager[] tm = { new MyX509TrustManager() };
SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
sslContext.init(null, tm, new java.security.SecureRandom());
// 从上述SSLContext对象中得到SSLSocketFactory对象
SSLSocketFactory ssf = sslContext.getSocketFactory();
URL url = new URL(requestUrl);
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
conn.setSSLSocketFactory(ssf);
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setUseCaches(false);
// 设置请求方式(GET/POST)
conn.setRequestMethod(requestMethod);
// 当outputStr不为null时向输出流写数据
if (null != paramStr) {
OutputStream outputStream = conn.getOutputStream();
// 注意编码格式
outputStream.write(paramStr.getBytes("UTF-8"));
outputStream.close();
}
// 从输入流读取返回内容
InputStream inputStream = conn.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(
inputStream, "utf-8");
BufferedReader bufferedReader = new BufferedReader(
inputStreamReader);
String str = null;
StringBuffer buffer = new StringBuffer();
while ((str = bufferedReader.readLine()) != null) {
buffer.append(str);
}
// 释放资源
bufferedReader.close();
inputStreamReader.close();
inputStream.close();
inputStream = null;
conn.disconnect();
jsonObject = JSONObject.fromObject(buffer.toString());
} catch (ConnectException ce) {
logger.error("连接{}超时:{}", requestUrl, ce);
} catch (Exception e) {
logger.error("https请求{}异常:{}", requestUrl, e);
}
return jsonObject;
}
private static class MyX509TrustManager implements X509TrustManager {
// 检查客户端证书
@Override
public void checkClientTrusted(X509Certificate[] chain, String authType)
throws CertificateException {
}
// 检查服务器端证书
@Override
public void checkServerTrusted(X509Certificate[] chain, String authType)
throws CertificateException {
}
// 返回受信任的X509证书数组
@Override
public X509Certificate[] getAcceptedIssuers() {
return null;
}
}
}