您好,登錄后才能下訂單哦!
本篇內容介紹了“java怎么發送https請求”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
需要兩個jar包,httpclient 和 httpcore。
PS:最好兩個jar包的版本要一致,并且要保證本地沒有同類名稱的jar包,否則jar包沖突可可以會報”java.lang.NoClassDefFoundError:org/apache/http/impl/client/HttpClients “這種class找不到的錯誤!本人就遇到這種錯誤,最后把相同的jar包全刪掉只保留一份(即便jar沒有build path進去也要刪掉)。
https協議比http安全性更高少量,具體原理如下:
用戶端在用HTTPS方式與Web服務器通信時有以下幾個步驟
(1)用戶用https的URL訪問Web服務器,要求與Web服務器建立SSL連接。
(2)Web服務器收到用戶端請求后,會將網站的證書信息(證書中包含公鑰)傳送一份給用戶端。
(3)用戶端的瀏覽器與Web服務器開始協商SSL連接的安全等級,也就是信息加密的等級。
(4)用戶端的瀏覽器根據雙方同意的安全等級,建立會話密鑰,而后利使用網站的公鑰將會話密鑰加密,并傳送給網站。
(5)Web服務器利使用自己的私鑰解密出會話密鑰。
(6)Web服務器利使用會話密鑰加密與用戶端之間的通信。
因而需要安全證書,當然通過java代碼方式能實現忽略證書的方式進行請求。
假如不在代碼中添加忽略證書的特殊解決,一般會直接拋出如下異常報錯:
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
即為提醒要發送證書才可以正常請求服務。
如下代碼功可以就是忽略證書:
//https 請求忽略證書
SSLContextBuilder builder = new SSLContextBuilder();
builder.loadTrustMaterial(null, new TrustSelfSignedStrategy());
SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(builder.build(), NoopHostnameVerifier.INSTANCE);
Registry registry = RegistryBuilder.create()
.register("http", new PlainConnectionSocketFactory())
.register("https", sslConnectionSocketFactory)
.build();
PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(registry);
cm.setMaxTotal(100);
CloseableHttpClient httpClient = HttpClients.custom()
.setSSLSocketFactory(sslConnectionSocketFactory)
.setConnectionManager(cm)
.build();
注意:上面的httpClient就是包裝好的忽略證書的http請求實例對象,到時候直接使用這個對象發請求。
try {
//https 請求忽略證書
SSLContextBuilder builder = new SSLContextBuilder();
builder.loadTrustMaterial(null, new TrustSelfSignedStrategy());
SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(builder.build(), NoopHostnameVerifier.INSTANCE);
Registry registry = RegistryBuilder.create()
.register("http", new PlainConnectionSocketFactory())
.register("https", sslConnectionSocketFactory)
.build();
PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(registry);
cm.setMaxTotal(100);
CloseableHttpClient httpClient = HttpClients.custom()
.setSSLSocketFactory(sslConnectionSocketFactory)
.setConnectionManager(cm)
.build();
//將使用戶信息同步到第三方系統中
String url="https://xx.xx.xx.xx:1001/bomp/sync/execute";
//發送post請求
HttpPost method = new HttpPost(url);
//準備json數據發送參數
JSONObject paramIn = new JSONObject();
paramIn.put("app_id", "B39900002");
paramIn.put("secret_key", "ea703f2a02ae48b5b269ab43607275fe");
//構造內層json對象
JSONArray account_list = new JSONArray();
JSONObject account_list_obj = new JSONObject();
account_list_obj.put("account", pojo.get("loginId"));
account_list_obj.put("eip_account", "");
account_list_obj.put("name", pojo.get("loginName"));
account_list_obj.put("phone", pojo.get("mobile"));
account_list_obj.put("password", "");
account_list_obj.put("status", 1);
account_list_obj.put("roles", "");
account_list.add(account_list_obj);
paramIn.put("account_list", account_list);
//處理中文亂碼問題
StringEntity entity = new StringEntity(paramIn.toString(),"utf-8");
entity.setContentEncoding("UTF-8");
entity.setContentType("application/json");
method.setEntity(entity);
//發送請求
HttpResponse result = httpClient.execute(method);
//請求結束,返回結果
String resData = EntityUtils.toString(result.getEntity());
System.out.println("RENWOXING result:"+resData);
//得到返回結果的j'son格式
JSONObject resJson = JSONObject.fromObject(resData);
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (org.apache.http.ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}catch(Exception e){
e.printStackTrace();
}
“java怎么發送https請求”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。