1. 程式人生 > >HttpClient 傳送 HTTP、HTTPS 請求的簡單封裝

HttpClient 傳送 HTTP、HTTPS 請求的簡單封裝

最近這幾周,一直在忙同一個專案,剛開始是瞭解需求,需求有一定了解之後,就開始調第三方的介面。由於第三方給提供的文件很模糊,在調介面的時候,出了很多問題,一直在溝通協調,具體的無奈就不說了,由於介面的訪問協議是通過 HTTP 和 HTTPS 通訊的,因此封裝了一個簡單的請求工具類,由於時間緊迫,並沒有額外的時間對工具類進行優化和擴充套件,如果後續空出時間的話,我會對該工具類繼續進行優化和擴充套件的。

引用

首先說一下該類中需要引入的 jar 包,apache 的 httpclient 包,版本號為 4.5,如有需要的話,可以引一下。

程式碼

import org.apache.commons.io.IOUtils; 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.HttpClient; 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.conn.ssl.TrustStrategy; import org.apache.http.conn.ssl.X509HostnameVerifier; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.DefaultHttpClient; 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 javax.net.ssl.SSLContext; import javax.net.ssl.SSLException; import javax.net.ssl.SSLSession; import javax.net.ssl.SSLSocket; import java.io.IOException; import java.io.InputStream; import java.nio.charset.Charset; import java.security.GeneralSecurityException; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map;   /**  * HTTP 請求工具類  *  * @author : liii  * @version : 1.0.0  * @date : 2015/7/21  * @see : TODO  */ public class HttpUtil {     private static PoolingHttpClientConnectionManager connMgr;     private static RequestConfig requestConfig;     private static final int MAX_TIMEOUT = 7000;       static {         // 設定連線池         connMgr = new PoolingHttpClientConnectionManager();         // 設定連線池大小         connMgr.setMaxTotal(100);         connMgr.setDefaultMaxPerRoute(connMgr.getMaxTotal());           RequestConfig.Builder configBuilder = RequestConfig.custom();         // 設定連線超時         configBuilder.setConnectTimeout(MAX_TIMEOUT);         // 設定讀取超時         configBuilder.setSocketTimeout(MAX_TIMEOUT);         // 設定從連線池獲取連線例項的超時         configBuilder.setConnectionRequestTimeout(MAX_TIMEOUT);         // 在提交請求之前 測試連線是否可用         configBuilder.setStaleConnectionCheckEnabled(true);         requestConfig = configBuilder.build();     }       /**      * 傳送 GET 請求(HTTP),不帶輸入資料      * @param url      * @return      */     public static String doGet(String url) {         return doGet(url, new HashMap<String, Object>());     }       /**      * 傳送 GET 請求(HTTP),K-V形式      * @param url      * @param params      * @return      */     public static String doGet(String url, Map<String, Object> params) {         String apiUrl = url;         StringBuffer param = new StringBuffer();         int i = 0;         for (String key : params.keySet()) {             if (i == 0)                 param.append("?");             else                 param.append("&");             param.append(key).append("=").append(params.get(key));             i++;         }         apiUrl += param;         String result = null;         HttpClient httpclient = new DefaultHttpClient();         try {             HttpGet httpPost = new HttpGet(apiUrl);             HttpResponse response = httpclient.execute(httpPost);             int statusCode = response.getStatusLine().getStatusCode();               System.out.println("執行狀態碼 : " + statusCode);               HttpEntity entity = response.getEntity();             if (entity != null) {                 InputStream instream = entity.getContent();                 result = IOUtils.toString(instream, "UTF-8");             }         } catch (IOException e) {             e.printStackTrace();         }         return result;     }       /**      * 傳送 POST 請求(HTTP),不帶輸入資料      * @param apiUrl      * @return      */     public static String doPost(String apiUrl) {         return doPost(apiUrl, new HashMap<String, Object>());     }       /**      * 傳送 POST 請求(HTTP),K-V形式      * @param apiUrl API介面URL      * @param params 引數map      * @return      */     public static String doPost(String apiUrl, Map<String, Object> params) {         CloseableHttpClient httpClient = HttpClients.createDefault();         String httpStr = null;         HttpPost httpPost = new HttpPost(apiUrl);         CloseableHttpResponse response = null;           try {             httpPost.setConfig(requestConfig);             List<NameValuePair> pairList = new ArrayList<>(params.size());             for (Map.Entry<String, Object> entry : params.entrySet()) {                 NameValuePair pair = new BasicNameValuePair(entry.getKey(), entry                         .getValue().toString());                 pairList.add(pair);             }             httpPost.setEntity(new UrlEncodedFormEntity(pairList, Charset.forName("UTF-8")));             response = httpClient.execute(httpPost);             System.out.println(response.toString());             HttpEntity entity = response.getEntity();             httpStr = EntityUtils.toString(entity, "UTF-8");         } catch (IOException e) {             e.printStackTrace();         } finally {             if (response != null) {                 try {                     EntityUtils.consume(response.getEntity());                 } catch (IOException e) {                     e.printStackTrace();                 }             }         }         return httpStr;     }       /**      * 傳送 POST 請求(HTTP),JSON形式      * @param apiUrl      * @param json json物件      * @return      */     public static String doPost(String apiUrl, Object json) {         CloseableHttpClient httpClient = HttpClients.createDefault();         String httpStr = null;         HttpPost httpPost = new HttpPost(apiUrl);         CloseableHttpResponse response = null;           try {             httpPost.setConfig(requestConfig);             StringEntity stringEntity = new StringEntity(json.toString(),"UTF-8");//解決中文亂碼問題             stringEntity.setContentEncoding("UTF-8");             stringEntity.setContentType("application/json");             httpPost.setEntity(stringEntity);             response = httpClient.execute(httpPost);             HttpEntity entity = response.getEntity();             System.out.println(response.getStatusLine().getStatusCode());             httpStr = EntityUtils.toString(entity, "UTF-8");         } catch (IOException e) {             e.printStackTrace();         } finally {             if (response != null) {                 try {                     EntityUtils.consume(response.getEntity());                 } catch (IOException e) {                     e.printStackTrace();                 }             }         }         return httpStr;     }       /**      * 傳送 SSL POST 請求(HTTPS),K-V形式      * @param apiUrl API介面URL      * @param params 引數map      * @return      */     public static String doPostSSL(String apiUrl, Map<String, Object> params) {         CloseableHttpClient httpClient = HttpClients.custom().setSSLSocketFactory(createSSLConnSocketFactory()).setConnectionManager(connMgr).setDefaultRequestConfig(requestConfig).build();         HttpPost httpPost = new HttpPost(apiUrl);         CloseableHttpResponse response = null;         String httpStr = null;           try {             httpPost.setConfig(requestConfig);             List<NameValuePair> pairList = new ArrayList<NameValuePair>(params.size());             for (Map.Entry<String, Object> entry : params.entrySet()) {                 NameValuePair pair = new BasicNameValuePair(entry.getKey(), entry                         .getValue().toString());                 pairList.add(pair);             }             httpPost.setEntity(new UrlEncodedFormEntity(pairList, Charset.forName("utf-8")));             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 (Exception e) {             e.printStackTrace();         } finally {             if (response != null) {                 try {                     EntityUtils.consume(response.getEntity());                 } catch (IOException e) {                     e.printStackTrace();                 }             }         }         return httpStr;     }       /**      * 傳送 SSL POST 請求(HTTPS),JSON形式      * @param apiUrl API介面URL      * @param json JSON物件      * @return      */     public static String doPostSSL(String apiUrl, Object json) {         CloseableHttpClient httpClient = HttpClients.custom().setSSLSocketFactory(createSSLConnSocketFactory()).setConnectionManager(connMgr).setDefaultRequestConfig(requestConfig).build();         HttpPost httpPost = new HttpPost(apiUrl);         CloseableHttpResponse response = null;         String httpStr = null;           try {             httpPost.setConfig(requestConfig);             StringEntity stringEntity = new StringEntity(json.toString(),"UTF-8");//解決中文亂碼問題             stringEntity.setContentEncoding("UTF-8");             stringEntity.setContentType("application/json");             httpPost.setEntity(stringEntity);             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 (Exception e) {             e.printStackTrace();         } finally {             if (response != null) {                 try {                     EntityUtils.consume(response.getEntity());                 } catch (IOException e) {                     e.printStackTrace();                 }             }         }         return httpStr;     }       /**      * 建立SSL安全連線      *      * @return      */     private static SSLConnectionSocketFactory createSSLConnSocketFactory() {         SSLConnectionSocketFactory sslsf = null;         try {             SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() {                   public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException {                     return true;                 }             }).build();             sslsf = new SSLConnectionSocketFactory(sslContext, new X509HostnameVerifier() {                   @Override                 public boolean verify(String arg0, SSLSession arg1) {                     return true;                 }                   @Override                 public void verify(String host, SSLSocket ssl) throws IOException {                 }                   @Override                 public void verify(String host, X509Certificate cert) throws SSLException {                 }                   @Override                 public void verify(String host, String[] cns, String[] subjectAlts) throws SSLException {                 }             });         } catch (GeneralSecurityException e) {             e.printStackTrace();         }         return sslsf;     }         /**      * 測試方法      * @param args      */     public static void main(String[] args) throws Exception {       } }