摘要:問題最近項目上面遇到和對接,測試庫他們使用的是,但是正式庫使用的是。之前沒有做過,在網上找過好多文章,最后還是借鑒別人的,自己重新封裝之后才在項目上面使用。以上是我在項目上面使用的,沒有添加全部的代碼,但是對應的方法都是可以使用的。
問題:
最近項目上面遇到和App對接,測試庫他們使用的是 HTTP,但是正式庫使用的是 HTTPS。之前沒有做過,在網上找過好多文章,最后還是借鑒別人的,自己重新封裝之后才在項目上面使用。使用的jar的版本:
httpclient-4.3.1.jar源碼:
下面給出忽略證書的方式,因為App對接又不能給證書,并且證書是通過CA驗證,只好通過此種方式去試試:
1.代碼中用到的兩個工具方法,以及請求的參數設置private static final int SOCKET_TIME_OUT = 60000; // 設置讀取超時 private static final int CONNECT_TIME_OUT = 60000; // 設置連接超時 /** * 設置請求的參數值 * @return */ private static RequestConfig getRequestConfig() { return RequestConfig.custom().setSocketTimeout(SOCKET_TIME_OUT).setConnectTimeout(CONNECT_TIME_OUT).build(); } /** * 設置參數列表 * @param param * @return */ private static List2.HTTPS 處理createParam(Map param) { List nvps = new ArrayList (); if(param != null) { for(String k : param.keySet()) { nvps.add(new BasicNameValuePair(k, param.get(k).toString())); } } return nvps; }
2.1創建連接對象:
/** * 創建一個SSL信任所有證書的httpClient對象 * @return */ public static CloseableHttpClient createSSLInsecureClient() { try { SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() { // 默認信任所有證書 public boolean isTrusted(X509Certificate[] arg0, String arg1) throws CertificateException { return true; } }).build(); // AllowAllHostnameVerifier: 這種方式不對主機名進行驗證,驗證功能被關閉,是個空操作(域名驗證) SSLConnectionSocketFactory sslcsf = new SSLConnectionSocketFactory(sslContext, SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); return HttpClients.custom().setSSLSocketFactory(sslcsf).build(); } catch (KeyManagementException e) { e.printStackTrace(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (KeyStoreException e) { e.printStackTrace(); } //如果創建失敗,就創建一個默認的Http的連接 return HttpClients.createDefault(); }
2.2調用方法:
/** * 無需本地證書keyStore的SSL https帶參數請求 * post K - V 格式的數據 * @param url * @param paramsMap * @param encoding * @return */ public static String postSSLParams(String url, Map3.調用HTTP的方法params, Map headers) { //創建一個信任的連接 CloseableHttpClient httpClient = createSSLInsecureClient(); //發送請求的實體類 HttpPost httpPost = new HttpPost(url); //接收返回值 StringBuilder sb = new StringBuilder(); BufferedReader br = null; try { // 設置客戶端請求的頭參數getParams已經過時,現在用requestConfig對象替換 httpPost.setConfig(getRequestConfig()); //設置請求的頭信息 Set keys = headers.keySet(); for (String key : keys) { httpPost.setHeader(key, headers.get(key).toString()); } //這個是設置請求的類型,這個可能需要重點注意下,需要看對方接收的是什么 httpPost.setHeader("Content-Type", "application/x-www-form-urlencoded"); //添加參數, 設置編碼格式 httpPost.setEntity(new UrlEncodedFormEntity( createParam(params) , Charset.forName("utf-8"))); //發送請求 HttpResponse response = httpClient.execute(httpPost); //接收返回值 HttpEntity httpEntity = response.getEntity(); //返回值處理 br = new BufferedReader(new InputStreamReader(httpEntity.getContent(),"utf-8")); String s = null; while((s=br.readLine())!=null){ sb.append(s); } } catch (UnsupportedEncodingException e) { throw new RuntimeException("指定的編碼集不對,您目前指定的編碼集是:" + "utf-8"); } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { throw new RuntimeException("讀取流文件異常",e); }catch (Exception e) { throw new RuntimeException("通訊未知系統異常",e); }finally{ if(br != null){ try { br.close(); } catch (IOException e) { e.printStackTrace(); } } } return sb.toString(); }
3.1 發送 HTTP,K-V形式
/** * 發送 POST 請求(HTTP),K-V形式 * @param url * @param param * @return * @throws Exception */ public static String defaultPost(String url, Mapparam) throws Exception{ String returnString = ""; CloseableHttpClient client = HttpClients.createDefault(); CloseableHttpResponse response = null; //設置字符集的兩種方式 //new UrlEncodedFormEntity( createParam(params), Charset.forName("UTF-8")) HttpEntity entity = new UrlEncodedFormEntity(createParam(param), Consts.UTF_8); try { HttpPost httpPost = new HttpPost(url); httpPost.setConfig(getRequestConfig()); httpPost.setHeader("Content-Type", "application/x-www-form-urlencoded"); httpPost.setEntity(entity); response = client.execute(httpPost); returnString = EntityUtils.toString(response.getEntity(), "UTF-8"); EntityUtils.consume(response.getEntity()); //關閉請求 return returnString; } catch(Exception e) { e.printStackTrace(); } return returnString; }
3.2 發送 HTTP,JSON形式
/** * 發送 POST 請求(HTTP),JSON形式 * @param url 調用的地址 * @param jsonParams 調用的參數 * @return * @throws Exception */ public static String postJson(String url, String jsonParams) throws Exception { //創建一個默認的連接對象 CloseableHttpClient httpClient = HttpClients.createDefault(); CloseableHttpResponse response = null; HttpPost httpPost = new HttpPost(url); String httpStr; try { StringEntity entity = new StringEntity(jsonParams); entity.setContentEncoding("UTF-8"); entity.setContentType("application/json"); httpPost.setEntity(entity); response = httpClient.execute(httpPost); httpStr = EntityUtils.toString(response.getEntity(), "UTF-8"); } finally { if (response != null) { EntityUtils.consume(response.getEntity()); } } return httpStr; }
另外幾點說明下:
1.由于我覺得get請求的方式實在是不安全,就沒有去研究get。 2.以上是我在項目上面使用的,沒有添加全部的代碼,但是對應的方法都是可以使用的。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/69956.html
摘要:基礎,超文本傳輸協議。不驗證通信方的身份,通信方的身份有可能遭遇偽裝。無法證明報文的完整性,報文有可能遭篡改。多路復用,支持單個連接多次請求,即連接共享,即每一個都是是用作連接共享機制的。 走在前端的大道上 本篇將自己讀過的相關 http/https 方法 文章中,對自己有啟發的章節片段總結在這(會對原文進行刪改),會不斷豐富提煉總結更新。 Web 基礎 HTTP(HyperText...
摘要:使用模擬好后端數據之后模擬數據的使用參考,就需要嘗試請求加載數據了。數據請求選擇了,現在都推薦使用。規定要發送到服務器的數據。布爾值,表示請求是否異步處理。要求為類型的參數,請求成功后調用的回調函數。在一個中重寫回調函數的字符串。 使用Mock模擬好后端數據之后(Mock模擬數據的使用參考:https://segmentfault.com/a/11...),就需要嘗試請求加載數據了。數...
摘要:前端基本功常見概念一點這里前端基本功常見概念二點這里前端基本功常見概念三點這里什么是原型鏈當一個引用類型繼承另一個引用類型的屬性和方法時候就會產生一個原型鏈。函數式編程是聲明式而不是命令式,并且應用程序狀態通過純函數流轉。 前端基本功-常見概念(一) 點這里前端基本功-常見概念(二) 點這里前端基本功-常見概念(三) 點這里 1.什么是原型鏈 當一個引用類型繼承另一個引用類型的屬性和方...
閱讀 3540·2021-11-18 10:02
閱讀 3109·2019-08-29 18:34
閱讀 3396·2019-08-29 17:00
閱讀 428·2019-08-29 12:35
閱讀 755·2019-08-28 18:22
閱讀 1927·2019-08-26 13:58
閱讀 1669·2019-08-26 10:39
閱讀 2676·2019-08-26 10:11