摘要:問題最近項目上面遇到和對接,測試庫他們使用的是,但是正式庫使用的是。之前沒有做過,在網(wǎng)上找過好多文章,最后還是借鑒別人的,自己重新封裝之后才在項目上面使用。以上是我在項目上面使用的,沒有添加全部的代碼,但是對應(yīng)的方法都是可以使用的。
問題:
最近項目上面遇到和App對接,測試庫他們使用的是 HTTP,但是正式庫使用的是 HTTPS。之前沒有做過,在網(wǎng)上找過好多文章,最后還是借鑒別人的,自己重新封裝之后才在項目上面使用。使用的jar的版本:
httpclient-4.3.1.jar源碼:
下面給出忽略證書的方式,因為App對接又不能給證書,并且證書是通過CA驗證,只好通過此種方式去試試:
1.代碼中用到的兩個工具方法,以及請求的參數(shù)設(shè)置private static final int SOCKET_TIME_OUT = 60000; // 設(shè)置讀取超時 private static final int CONNECT_TIME_OUT = 60000; // 設(shè)置連接超時 /** * 設(shè)置請求的參數(shù)值 * @return */ private static RequestConfig getRequestConfig() { return RequestConfig.custom().setSocketTimeout(SOCKET_TIME_OUT).setConnectTimeout(CONNECT_TIME_OUT).build(); } /** * 設(shè)置參數(shù)列表 * @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創(chuàng)建連接對象:
/** * 創(chuàng)建一個SSL信任所有證書的httpClient對象 * @return */ public static CloseableHttpClient createSSLInsecureClient() { try { SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() { // 默認(rèn)信任所有證書 public boolean isTrusted(X509Certificate[] arg0, String arg1) throws CertificateException { return true; } }).build(); // AllowAllHostnameVerifier: 這種方式不對主機(jī)名進(jìn)行驗證,驗證功能被關(guān)閉,是個空操作(域名驗證) 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(); } //如果創(chuàng)建失敗,就創(chuàng)建一個默認(rèn)的Http的連接 return HttpClients.createDefault(); }
2.2調(diào)用方法:
/** * 無需本地證書keyStore的SSL https帶參數(shù)請求 * post K - V 格式的數(shù)據(jù) * @param url * @param paramsMap * @param encoding * @return */ public static String postSSLParams(String url, Map3.調(diào)用HTTP的方法params, Map headers) { //創(chuàng)建一個信任的連接 CloseableHttpClient httpClient = createSSLInsecureClient(); //發(fā)送請求的實體類 HttpPost httpPost = new HttpPost(url); //接收返回值 StringBuilder sb = new StringBuilder(); BufferedReader br = null; try { // 設(shè)置客戶端請求的頭參數(shù)getParams已經(jīng)過時,現(xiàn)在用requestConfig對象替換 httpPost.setConfig(getRequestConfig()); //設(shè)置請求的頭信息 Set keys = headers.keySet(); for (String key : keys) { httpPost.setHeader(key, headers.get(key).toString()); } //這個是設(shè)置請求的類型,這個可能需要重點注意下,需要看對方接收的是什么 httpPost.setHeader("Content-Type", "application/x-www-form-urlencoded"); //添加參數(shù), 設(shè)置編碼格式 httpPost.setEntity(new UrlEncodedFormEntity( createParam(params) , Charset.forName("utf-8"))); //發(fā)送請求 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("通訊未知系統(tǒng)異常",e); }finally{ if(br != null){ try { br.close(); } catch (IOException e) { e.printStackTrace(); } } } return sb.toString(); }
3.1 發(fā)送 HTTP,K-V形式
/** * 發(fā)送 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; //設(shè)置字符集的兩種方式 //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()); //關(guān)閉請求 return returnString; } catch(Exception e) { e.printStackTrace(); } return returnString; }
3.2 發(fā)送 HTTP,JSON形式
/** * 發(fā)送 POST 請求(HTTP),JSON形式 * @param url 調(diào)用的地址 * @param jsonParams 調(diào)用的參數(shù) * @return * @throws Exception */ public static String postJson(String url, String jsonParams) throws Exception { //創(chuàng)建一個默認(rèn)的連接對象 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.以上是我在項目上面使用的,沒有添加全部的代碼,但是對應(yīng)的方法都是可以使用的。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/69956.html
摘要:基礎(chǔ),超文本傳輸協(xié)議。不驗證通信方的身份,通信方的身份有可能遭遇偽裝。無法證明報文的完整性,報文有可能遭篡改。多路復(fù)用,支持單個連接多次請求,即連接共享,即每一個都是是用作連接共享機(jī)制的。 走在前端的大道上 本篇將自己讀過的相關(guān) http/https 方法 文章中,對自己有啟發(fā)的章節(jié)片段總結(jié)在這(會對原文進(jìn)行刪改),會不斷豐富提煉總結(jié)更新。 Web 基礎(chǔ) HTTP(HyperText...
摘要:使用模擬好后端數(shù)據(jù)之后模擬數(shù)據(jù)的使用參考,就需要嘗試請求加載數(shù)據(jù)了。數(shù)據(jù)請求選擇了,現(xiàn)在都推薦使用。規(guī)定要發(fā)送到服務(wù)器的數(shù)據(jù)。布爾值,表示請求是否異步處理。要求為類型的參數(shù),請求成功后調(diào)用的回調(diào)函數(shù)。在一個中重寫回調(diào)函數(shù)的字符串。 使用Mock模擬好后端數(shù)據(jù)之后(Mock模擬數(shù)據(jù)的使用參考:https://segmentfault.com/a/11...),就需要嘗試請求加載數(shù)據(jù)了。數(shù)...
摘要:前端基本功常見概念一點這里前端基本功常見概念二點這里前端基本功常見概念三點這里什么是原型鏈當(dāng)一個引用類型繼承另一個引用類型的屬性和方法時候就會產(chǎn)生一個原型鏈。函數(shù)式編程是聲明式而不是命令式,并且應(yīng)用程序狀態(tài)通過純函數(shù)流轉(zhuǎn)。 前端基本功-常見概念(一) 點這里前端基本功-常見概念(二) 點這里前端基本功-常見概念(三) 點這里 1.什么是原型鏈 當(dāng)一個引用類型繼承另一個引用類型的屬性和方...
閱讀 3546·2021-11-18 10:02
閱讀 3115·2019-08-29 18:34
閱讀 3404·2019-08-29 17:00
閱讀 434·2019-08-29 12:35
閱讀 761·2019-08-28 18:22
閱讀 1941·2019-08-26 13:58
閱讀 1675·2019-08-26 10:39
閱讀 2682·2019-08-26 10:11