模擬https類型的get,post請求時,碰到證書不信任,無法正常獲取返回內容的異常

解決方案,藉助X509TrustManager,再創建httpClient的時候設置信任所有證書,
自己封裝的創建closeableHttpClient

public static CloseableHttpClient createHttpsClient() throws Exception {

        //證書信任管理者
        X509TrustManager x509mgr = new X509TrustManager() {
            @Override
            public void checkClientTrusted(X509Certificate[] xcs, String string) {
            }

            @Override
            public void checkServerTrusted(X509Certificate[] xcs, String string) {
            }

            @Override
            public X509Certificate[] getAcceptedIssuers() {
                return null;
            }
        };
        //獲取一個SSLContext實例
        SSLContext sslContext = SSLContext.getInstance("TLS");
        //初始化SSLContext實例
        sslContext.init(null, new TrustManager[]{x509mgr}, new java.security.SecureRandom());
        //構建一個SSLConnectionSocket工廠,設置爲信任所有證書
        SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext,
                SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
        //返回CloseableHttpClient對象
        return HttpClients.custom().setSSLSocketFactory(sslsf).build();
    }

用法示例

/**
     * 發送Post請求
     * @param url url
     * @param params json,發送的內容
     * @param headers headers,發送頭
     * @return true or false
     */
    public static JSONObject post(String url, String params, String headers){
        CloseableHttpClient closeableHttpClient = null;
        JSONObject result = new JSONObject();
        //建立一個連接
        try {
            closeableHttpClient = createHttpsClient();

            //創建一個HttpPost
            HttpPost httpPost = new HttpPost(url);
            //設置發送的內容
            httpPost.setEntity(new StringEntity(params));
            //設置頭信息
            JSONObject jsonObject = JSONObject.parseObject(headers);
            Set<String> keys = jsonObject.keySet();
            for (String key : keys){
                httpPost.setHeader(key,jsonObject.getString(key));
            }
            //發送
            HttpResponse httpResponse = closeableHttpClient.execute(httpPost);
            int returnCode = httpResponse.getStatusLine().getStatusCode();
            if (returnCode == HttpStatus.SC_OK) {
                InputStream is = httpResponse.getEntity().getContent();
                BufferedReader in = new BufferedReader(new InputStreamReader(is));
                StringBuffer buffer = new StringBuffer();
                String line = "";
                while ((line = in.readLine()) != null) {
                    buffer.append(line);
                }
                result.put("code","200");
                result.put("result",JSONObject.parseObject(buffer.toString()));
                return result;
            } else {
                result.put("code","404");
                result.put("result","no result");
                return result;
            }
        } catch (Exception e) {
            e.printStackTrace();
            result.put("code","404");
            result.put("result","no result");
            return result;
        }
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章