package com.iups.wx.util; import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.Map;
import java.util.Map.Entry; import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager; import net.sf.json.JSONObject; import org.apache.http.HttpEntity;
import org.apache.http.client.ClientProtocolException;
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.config.Registry;
import org.apache.http.config.RegistryBuilder;
import org.apache.http.conn.socket.ConnectionSocketFactory;
import org.apache.http.conn.socket.PlainConnectionSocketFactory;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.entity.StringEntity;
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.util.EntityUtils;
import org.apache.log4j.Logger; /**
* 调用远程接口工具类
* @author Administrator
* @date 2017年2月16日 13:44:03
*/
public class HttpsClientUtil { //日志
public static Logger log = Logger.getLogger(HttpsClientUtil.class);
//编码方式
private static String UTF8 = "UTF-8";
//数据格式
private final String APPLICATION_JSON = "application/json";
//数据类型标识
public final String CONTENT_TYPE = "Content-Type";
//https请求客户端
private CloseableHttpClient httpclient = null; private static HttpsClientUtil httpsClientUtil; private HttpsClientUtil(){
try{
// 创建SSLContext对象,并使用我们指定的信任管理器初始化
SSLContext sslContext = SSLContext.getInstance("SSL");
sslContext.init(null, new TrustManager[]{
//证书信任管理器(用于https请求)
new X509TrustManager(){
@Override
public void checkClientTrusted(X509Certificate[] arg0,
String arg1) throws CertificateException {
}
@Override
public void checkServerTrusted(X509Certificate[] arg0,
String arg1) throws CertificateException {
}
@Override
public X509Certificate[] getAcceptedIssuers() {
return null;
}
}
}, new SecureRandom());
//获取注册建造者
RegistryBuilder<ConnectionSocketFactory> registryBuilder = RegistryBuilder.create();
//注册http和https请求
Registry<ConnectionSocketFactory> socketFactoryRegistry = registryBuilder.register("http", PlainConnectionSocketFactory.INSTANCE)
.register("https", new SSLConnectionSocketFactory(sslContext))
.build();
//获取HttpClient池管理者
PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry);
//初始化httpClient
httpclient = HttpClients.custom().setConnectionManager(connManager).build();
}catch(KeyManagementException e){
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
}; /**
* 创建httpsClientUtil对象
* @return
*/
public static HttpsClientUtil getInstance(){
if(httpsClientUtil==null){
httpsClientUtil = new HttpsClientUtil();
}
return httpsClientUtil;
} /**
* 描述: 发送post or get请求并获取结果
* @param requestUrl 请求地址
* @param requestMethod 请求方式(GET、POST)
* @param outputStr 提交的数据
* @return JSONObject(通过JSONObject.get(key)的方式获取json对象的属性值)
*/
public JSONObject sendRequest(String requestUrl, String requestMethod, String outputStr){
String responseObj = null;
CloseableHttpResponse execute = null;
try{
if("POST".equals(requestMethod)){
HttpPost httpPost = new HttpPost(requestUrl);
httpPost.addHeader(CONTENT_TYPE, APPLICATION_JSON);
// 将JSON字符串进行UTF-8编码,以便传输中文
StringEntity requestEntity = new StringEntity(outputStr,HttpsClientUtil.UTF8);
httpPost.setEntity(requestEntity);
execute = httpclient.execute(httpPost);
}else{
HttpGet httpGet = new HttpGet(requestUrl);
httpGet.addHeader(CONTENT_TYPE, APPLICATION_JSON);
execute = httpclient.execute(httpGet);
}
HttpEntity responseEntity = execute.getEntity();
if(responseEntity!=null){
responseObj = EntityUtils.toString(responseEntity,HttpsClientUtil.UTF8);
}
}catch(UnsupportedEncodingException e){
e.printStackTrace();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
//关闭响应流
if(execute!=null) execute.close();
} catch (IOException e) {
e.printStackTrace();
}
}
log.info("远程接口响应:"+responseObj);
return JSONObject.fromObject(responseObj);
} /**
* 描述: 发送post请求并获取结果
* @param requestUrl 请求地址
* @param requestUrlParam 请求地址拼接参数
* @param outputStr 提交的数据
* @return JSONObject(通过JSONObject.get(key)的方式获取json对象的属性值)
*/
public JSONObject sendPostRequest(String requestUrl,Map<String,String> requestUrlParam, String outputStr){
return sendRequest(requestUrlParam(requestUrl, requestUrlParam), "POST", outputStr);
} /**
* 描述: 发送get请求并获取结果
* @param requestUrl 请求地址
* @param requestUrlParam 请求地址拼接参数
* @return JSONObject(通过JSONObject.get(key)的方式获取json对象的属性值)
*/
public JSONObject sendGetRequest(String requestUrl,Map<String,String> requestUrlParam){
return sendRequest(requestUrlParam(requestUrl, requestUrlParam), "GET", null);
} /**
* 描述:拼接URL后接参数
* @param requestUrl 请求地址
* @param requestUrlParam 请求地址拼接参数
* @return 带参数请求地址
*/
public String requestUrlParam(String requestUrl,Map<String,String> requestUrlParam){
if(requestUrlParam==null){
return requestUrl;
}
String requestParam = "";
for (Entry<String, String> entry : requestUrlParam.entrySet()) {
String key = entry.getKey();
String value = entry.getValue();
requestParam += "&"+key+"="+value;
}
if(requestParam.length()>0){
if(requestUrl.indexOf("?")==-1){
requestUrl = requestUrl+"?"+requestParam.substring(1);
}else{
requestUrl = requestUrl+requestParam;
}
}
return requestUrl;
} }