HttpClient的請求很廣泛,但有時咱們更多地傾向於基於SSL安全的HTTP請求——HTTPS。接口在交互過程當中,因爲最初採用的是基於Spring的HttpClient請求方式,因此須要修改替換爲HTTPS的請求方式。 參考代碼java
添加maven依賴配置git
<dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.2.3</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.4</version> </dependency>
Apache HTTPS整理代碼github
package com.wlyd.fmcgwms.util.api; import java.io.IOException; import java.security.KeyManagementException; 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.UUID; import javax.net.ssl.SSLContext; import javax.net.ssl.TrustManager; import javax.net.ssl.X509TrustManager; import org.apache.commons.lang.exception.ExceptionUtils; 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.methods.HttpPost; import org.apache.http.conn.scheme.Scheme; import org.apache.http.conn.ssl.SSLSocketFactory; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.message.BasicNameValuePair; import org.apache.http.util.EntityUtils; import com.alibaba.fastjson.JSONObject; import com.wlyd.fmcgwms.util.Log; import com.wlyd.fmcgwms.util.SAASTokenManager; import com.wlyd.fmcgwms.util.ehcache.EhcacheUtil; /** * Apache HttpClient JSON參數請求方式 * * @package com.wlyd.fmcgwms.util.api.APIHttpClient * @date 2016年11月11日 下午5:46:01 * @author pengjunlin * @comment * @update */ public class APIHttpClient { // 接口地址 private String apiURL = ""; private Log logger = Log.getLogger(getClass()); private HttpClient httpClient = null; private HttpPost method = null; private long startTime = 0L; private long endTime = 0L; private int status = 0; /** * 接口地址 * * @param url */ public APIHttpClient(String url) { this.apiURL = url; String platformCode = EhcacheUtil.get("WAAS_PLATFORMCODE").toString(); String memberCode = EhcacheUtil.get("WAAS_MEMBERCODE").toString(); httpClient = new DefaultHttpClient(); method = new HttpPost(apiURL); method.setHeader("Accept", "application/json"); method.setHeader("Accpet-Encoding", "gzip"); method.setHeader("Content-Encoding", "UTF-8"); method.setHeader("Content-Type", "application/json; charset=UTF-8"); method.setHeader("Token", SAASTokenManager.getToken()); method.setHeader("PlatformCode", platformCode); method.setHeader("MemberCode", memberCode); method.setHeader("Sequence", UUID.randomUUID().toString()); //========================設置忽略訪問SSL=================== // 建立TrustManager X509TrustManager xtm = new X509TrustManager() { public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { } public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { } public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[] {}; } }; SSLContext ctx=null; try { ctx = SSLContext.getInstance("SSL"); } catch (NoSuchAlgorithmException e) { // TODO Auto-generated catch block e.printStackTrace(); } // 使用TrustManager來初始化該上下文,TrustManager只是被SSL的Socket所使用 try { ctx.init(null, new TrustManager[] { xtm }, null); } catch (KeyManagementException e) { // TODO Auto-generated catch block e.printStackTrace(); } SSLSocketFactory sf = new SSLSocketFactory( ctx, SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); Scheme sch = new Scheme("https", 443, sf); httpClient.getConnectionManager().getSchemeRegistry().register(sch); } /** * 接口地址 * * @param url * @param uuid */ public APIHttpClient(String url,String uuid) { apiURL = url; String platformCode = EhcacheUtil.get("WAAS_PLATFORMCODE").toString(); String memberCode = EhcacheUtil.get("WAAS_MEMBERCODE").toString(); httpClient = new DefaultHttpClient(); method = new HttpPost(apiURL); method.setHeader("Accept", "application/json"); method.setHeader("Accpet-Encoding", "gzip"); method.setHeader("Content-Encoding", "UTF-8"); method.setHeader("Content-Type", "application/json; charset=UTF-8"); method.setHeader("Token", SAASTokenManager.getToken()); method.setHeader("PlatformCode", platformCode); method.setHeader("MemberCode", memberCode); method.setHeader("Sequence", uuid); //========================設置忽略訪問SSL=================== // 建立TrustManager X509TrustManager xtm = new X509TrustManager() { public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { } public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { } public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[] {}; } }; SSLContext ctx=null; try { ctx = SSLContext.getInstance("SSL"); } catch (NoSuchAlgorithmException e) { // TODO Auto-generated catch block e.printStackTrace(); } // 使用TrustManager來初始化該上下文,TrustManager只是被SSL的Socket所使用 try { ctx.init(null, new TrustManager[] { xtm }, null); } catch (KeyManagementException e) { // TODO Auto-generated catch block e.printStackTrace(); } SSLSocketFactory sf = new SSLSocketFactory( ctx, SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); Scheme sch = new Scheme("https", 443, sf); httpClient.getConnectionManager().getSchemeRegistry().register(sch); } /** * 調用 API * * @param parameters * @return */ public String post(String parameters) { String body = null; logger.info("parameters:" + parameters); if (method != null & parameters != null && !"".equals(parameters.trim())) { JSONObject jsonObject = JSONObject.parseObject(parameters); logger.info("json:" + jsonObject.toString()); try { List<NameValuePair> params = new ArrayList<NameValuePair>(); // 創建一個NameValuePair數組,用於存儲欲傳送的參數 params.add(new BasicNameValuePair("data", parameters)); StringEntity entity=new StringEntity(parameters, "UTF-8"); // 添加參數 method.setEntity(entity/*new UrlEncodedFormEntity(params, "UTF-8")*/); startTime = System.currentTimeMillis(); // 設置編碼 HttpResponse response = httpClient.execute(method); endTime = System.currentTimeMillis(); int statusCode = response.getStatusLine().getStatusCode(); logger.info("statusCode:" + statusCode); logger.info("調用API 花費時間(單位:毫秒):" + (endTime - startTime)); if (statusCode != HttpStatus.SC_OK) { logger.error("Method failed:" + response.getStatusLine()); status = 1; } // Read the response body body = EntityUtils.toString(response.getEntity()); } catch (IOException e) { // 發生網絡異常 logger.error("exception occurred!\n" + ExceptionUtils.getFullStackTrace(e)); // 網絡錯誤 status = 3; } finally { logger.info("調用接口狀態:" + status); } } return body; } /** * 0.成功 1.執行方法失敗 2.協議錯誤 3.網絡錯誤 * * @return the status */ public int getStatus() { return status; } /** * @param status * the status to set */ public void setStatus(int status) { this.status = status; } /** * @return the startTime */ public long getStartTime() { return startTime; } /** * @return the endTime */ public long getEndTime() { return endTime; } }
簡單重構以後apache
package com.wlyd.fmcgwms.util.api; import java.io.IOException; import java.security.KeyManagementException; 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.UUID; import javax.net.ssl.SSLContext; import javax.net.ssl.TrustManager; import javax.net.ssl.X509TrustManager; import org.apache.commons.lang.exception.ExceptionUtils; 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.methods.HttpPost; import org.apache.http.conn.scheme.Scheme; import org.apache.http.conn.ssl.SSLSocketFactory; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.message.BasicNameValuePair; import org.apache.http.util.EntityUtils; import com.alibaba.fastjson.JSONObject; import com.wlyd.fmcgwms.util.Log; import com.wlyd.fmcgwms.util.SAASTokenManager; import com.wlyd.fmcgwms.util.ehcache.EhcacheUtil; /** * Apache HttpClient JSON參數請求方式 * * @package com.wlyd.fmcgwms.util.api.APIHttpClient * @date 2016年11月11日 下午5:46:01 * @author pengjunlin * @comment * @update */ public class APIHttpClient { // 接口地址 private String apiURL = ""; private Log logger = Log.getLogger(getClass()); private HttpClient httpClient = null; private HttpPost method = null; private long startTime = 0L; private long endTime = 0L; private int status = 0; /** * 設置忽略安全驗證 * * @MethodName: initHttps * @Description: * @throws */ private void initHttps(){ //========================設置忽略訪問SSL=================== // 建立TrustManager X509TrustManager xtm = new X509TrustManager() { public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { } public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { } public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[] {}; } }; SSLContext ctx=null; try { ctx = SSLContext.getInstance("SSL"); } catch (NoSuchAlgorithmException e) { // TODO Auto-generated catch block e.printStackTrace(); } // 使用TrustManager來初始化該上下文,TrustManager只是被SSL的Socket所使用 try { ctx.init(null, new TrustManager[] { xtm }, null); } catch (KeyManagementException e) { // TODO Auto-generated catch block e.printStackTrace(); } SSLSocketFactory sf = new SSLSocketFactory( ctx, SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); Scheme sch = new Scheme("https", 443, sf); httpClient.getConnectionManager().getSchemeRegistry().register(sch); } /** * 接口地址 * * @param url */ public APIHttpClient(String url) { this.apiURL = url; String platformCode = EhcacheUtil.get("WAAS_PLATFORMCODE").toString(); String memberCode = EhcacheUtil.get("WAAS_MEMBERCODE").toString(); httpClient = new DefaultHttpClient(); method = new HttpPost(apiURL); method.setHeader("Accept", "application/json"); method.setHeader("Accpet-Encoding", "gzip"); method.setHeader("Content-Encoding", "UTF-8"); method.setHeader("Content-Type", "application/json; charset=UTF-8"); method.setHeader("Token", SAASTokenManager.getToken()); method.setHeader("PlatformCode", platformCode); method.setHeader("MemberCode", memberCode); method.setHeader("Sequence", UUID.randomUUID().toString()); // 設置忽略訪問SSL initHttps(); } /** * 接口地址 * * @param url * @param uuid */ public APIHttpClient(String url,String uuid) { apiURL = url; String platformCode = EhcacheUtil.get("WAAS_PLATFORMCODE").toString(); String memberCode = EhcacheUtil.get("WAAS_MEMBERCODE").toString(); httpClient = new DefaultHttpClient(); method = new HttpPost(apiURL); method.setHeader("Accept", "application/json"); method.setHeader("Accpet-Encoding", "gzip"); method.setHeader("Content-Encoding", "UTF-8"); method.setHeader("Content-Type", "application/json; charset=UTF-8"); method.setHeader("Token", SAASTokenManager.getToken()); method.setHeader("PlatformCode", platformCode); method.setHeader("MemberCode", memberCode); method.setHeader("Sequence", uuid); // 設置忽略訪問SSL initHttps(); } /** * 調用 API * * @param parameters * @return */ public String post(String parameters) { String body = null; logger.info("parameters:" + parameters); if (method != null & parameters != null && !"".equals(parameters.trim())) { JSONObject jsonObject = JSONObject.parseObject(parameters); logger.info("json:" + jsonObject.toString()); try { List<NameValuePair> params = new ArrayList<NameValuePair>(); // 創建一個NameValuePair數組,用於存儲欲傳送的參數 params.add(new BasicNameValuePair("data", parameters)); StringEntity entity=new StringEntity(parameters, "UTF-8"); // 添加參數 method.setEntity(entity/*new UrlEncodedFormEntity(params, "UTF-8")*/); startTime = System.currentTimeMillis(); // 設置編碼 HttpResponse response = httpClient.execute(method); endTime = System.currentTimeMillis(); int statusCode = response.getStatusLine().getStatusCode(); logger.info("statusCode:" + statusCode); logger.info("調用API 花費時間(單位:毫秒):" + (endTime - startTime)); if (statusCode != HttpStatus.SC_OK) { logger.error("Method failed:" + response.getStatusLine()); status = 1; } // Read the response body body = EntityUtils.toString(response.getEntity()); } catch (IOException e) { // 發生網絡異常 logger.error("exception occurred!\n" + ExceptionUtils.getFullStackTrace(e)); // 網絡錯誤 status = 3; } finally { logger.info("調用接口狀態:" + status); } } return body; } /** * 0.成功 1.執行方法失敗 2.協議錯誤 3.網絡錯誤 * * @return the status */ public int getStatus() { return status; } /** * @param status * the status to set */ public void setStatus(int status) { this.status = status; } /** * @return the startTime */ public long getStartTime() { return startTime; } /** * @return the endTime */ public long getEndTime() { return endTime; } }
利用IDE 查看Apache HttpClient API編程
編程小技巧json
Maven給了咱們許多方便,能夠找到對應class以查看其源碼。在這裏有一個值得查看源碼的情形是:在不知道API是否支持你所須要的數據類型時,第一是查看API的官方文檔及其源碼,第二就是對其源碼進行改造以適應當前所需。api
資源下載數組
Github地址安全