成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

HttpCilent 發(fā)送 POST Http以及Https請求,簡單封裝

Rainie / 1104人閱讀

摘要:問題最近項目上面遇到和對接,測試庫他們使用的是,但是正式庫使用的是。之前沒有做過,在網(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 List 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.HTTPS 處理
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, Map 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.調(diào)用HTTP的方法
3.1 發(fā)送 HTTP,K-V形式
    /**
     * 發(fā)送 POST 請求(HTTP),K-V形式
     * @param url
     * @param param
     * @return
     * @throws Exception
     */
    public static String defaultPost(String url, Map param) 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

相關(guān)文章

  • 一篇文章帶你了解http/https

    摘要:基礎(chǔ),超文本傳輸協(xié)議。不驗證通信方的身份,通信方的身份有可能遭遇偽裝。無法證明報文的完整性,報文有可能遭篡改。多路復(fù)用,支持單個連接多次請求,即連接共享,即每一個都是是用作連接共享機(jī)制的。 走在前端的大道上 本篇將自己讀過的相關(guān) http/https 方法 文章中,對自己有啟發(fā)的章節(jié)片段總結(jié)在這(會對原文進(jìn)行刪改),會不斷豐富提煉總結(jié)更新。 Web 基礎(chǔ) HTTP(HyperText...

    2bdenny 評論0 收藏0
  • axios異步請求數(shù)據(jù)的簡單使用

    摘要:使用模擬好后端數(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ù)...

    forsigner 評論0 收藏0
  • 前端基本功-常見概念(一)

    摘要:前端基本功常見概念一點這里前端基本功常見概念二點這里前端基本功常見概念三點這里什么是原型鏈當(dāng)一個引用類型繼承另一個引用類型的屬性和方法時候就會產(chǎn)生一個原型鏈。函數(shù)式編程是聲明式而不是命令式,并且應(yīng)用程序狀態(tài)通過純函數(shù)流轉(zhuǎn)。 前端基本功-常見概念(一) 點這里前端基本功-常見概念(二) 點這里前端基本功-常見概念(三) 點這里 1.什么是原型鏈 當(dāng)一個引用類型繼承另一個引用類型的屬性和方...

    bladefury 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<