帶SSL證書的httpclient 遠程接口工具類


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;
    }
    
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM