httpclient版本:4.5.2
package com.maven.httpclient.util;
import java.io.IOException;
import java.nio.charset.Charset;
import java.security.KeyManagementException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.net.ssl.SSLContext;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
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.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.conn.ssl.SSLContextBuilder;
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.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.apache.http.conn.ssl.TrustStrategy;
public class HttpUitl {
private static PoolingHttpClientConnectionManager conMgr;
private static RequestConfig requestConfig;
private static final int MAX_TIMEOUT = 7000;
static{
//设置连接池
conMgr = new PoolingHttpClientConnectionManager();
conMgr.setMaxTotal(100);
conMgr.setDefaultMaxPerRoute(conMgr.getMaxTotal());
RequestConfig.Builder configBuilder = RequestConfig.custom();
configBuilder.setConnectTimeout(MAX_TIMEOUT);
configBuilder.setSocketTimeout(MAX_TIMEOUT);
configBuilder.setConnectionRequestTimeout(MAX_TIMEOUT);
requestConfig = configBuilder.build();
}
/**
* 发送get请求
* @param url
* @param headers
* @param params
* @param isHttps
* @return
*/
public static String doGet(String url, Map headers, Map params,
boolean isHttps){
HttpResponse response = null;
String apiUrl = url;
StringBuffer param = new StringBuffer();
int i = 0;
if(params != null && !params.isEmpty()){
for(String key : params.keySet()){
if(i == 0){
param.append("?");
}else{
param.append("&");
}
param.append(key).append("=").append(params.get(key));
}
}
apiUrl += param;
System.out.println("ss:"+apiUrl);
String result = null;
CloseableHttpClient httpclient = null;
if(isHttps){
httpclient = createSSLClientDefault();
}else{
httpclient = HttpClients.createDefault();
}
HttpGet httpGet = new HttpGet(apiUrl);
if(headers != null && !headers.isEmpty()){
for(String key : headers.keySet()){
httpGet.setHeader(key, headers.get(key).toString());
}
}
try {
response = httpclient.execute(httpGet);
int statusCode = response.getStatusLine().getStatusCode();
System.out.println("执行状态码: " + statusCode);
HttpEntity entity = response.getEntity();
if(entity != null){
result = EntityUtils.toString(entity, "UTF-8");
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally{
if(response != null){
try {
EntityUtils.consume(response.getEntity());
} catch (IOException e) {
e.printStackTrace();
}
}
}
return result;
}
public static String doPost(String apiUrl, Map headers, Map params,
boolean isHttps){
CloseableHttpClient httpclient = createSSLClientDefault();
HttpPost httpPost = new HttpPost(apiUrl);
CloseableHttpResponse response = null;
String httpStr = null;
httpPost.setConfig(requestConfig);
if(headers != null && !headers.isEmpty()){
for(String key : headers.keySet()){
httpPost.setHeader(key, headers.get(key).toString());
}
}
if(params != null && !params.isEmpty()){
List pairList = new ArrayList(params.size());
for(Map.Entry entry : params.entrySet()){
NameValuePair pair = new BasicNameValuePair(entry.getKey(), entry.getValue().toString());
pairList.add(pair);
}
httpPost.setEntity(new UrlEncodedFormEntity(pairList, Charset.forName("UTF-8")));
}
try {
response = httpclient.execute(httpPost);
int statusCode = response.getStatusLine().getStatusCode();
if(statusCode != HttpStatus.SC_OK){
return null;
}
HttpEntity entity = response.getEntity();
if(entity != null){
return null;
}
httpStr = EntityUtils.toString(entity, "UTF-8");
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally{
if (response != null) {
try {
EntityUtils.consume(response.getEntity());
} catch (IOException e) {
e.printStackTrace();
}
}
}
return httpStr;
}
/**
* 创建SSL连接
* @return
*/
public static CloseableHttpClient createSSLClientDefault(){
try {
@SuppressWarnings("deprecation")
SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() {
//信任所有
public boolean isTrusted(X509Certificate[] chain,
String authType) throws CertificateException {
return true;
}
}).build();
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext);
return HttpClients.custom().setSSLSocketFactory(sslsf).build();
} catch (KeyManagementException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (KeyStoreException e) {
e.printStackTrace();
}
return HttpClients.createDefault();
}
}
在代码测试中发现发送HTTPS请求时会报一个异常:
# Exception in thread "main" javax.net.ssl.SSLException: hostname in certificate didn't match: !=
# at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:220)
# at org.apache.http.conn.ssl.BrowserCompatHostnameVerifier.verify(BrowserCompatHostnameVerifier.java:54)
查找资料后,只要将创建SSL连接的
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext);
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext, SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
参考网址:
http://blog.csdn.net/happylee6688/article/details/47148227
http://blog.csdn.net/liufang1991/article/details/51595952
http://blog.csdn.net/blue_jjw/article/details/8768624
http://jinnianshilongnian.iteye.com/blog/2089792
http://blog.csdn.net/jbgtwang/article/details/38303183