Java如何向http/https接口發出請求

用Java發送web請求所用到的包都在java.net下,在具體使用時可以用如下代碼,你可以把它封裝成一個工具類

import javax.net.ssl.*;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.security.SecureRandom;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;public class Testt {/*HostnameVerifier 是一個Java接口其中的verify方法用來在下面的類中提供主機名的SSL校驗這里個人用不做具體校驗所有的主機名都給過*/final static HostnameVerifier DO_NOT_VERIFY = new HostnameVerifier(){public boolean verify(String arg0, SSLSession arg1) {return true;}};/*trustAllHosts方法 方法創建了一個 TrustManager 接口的匿名實現它是用來檢查證書的,無論是服務器證書還是客戶端證書這通過重寫 checkServerTrusted 和 checkClientTrusted 方法為空 不做任何檢查*/public static void trustAllHosts() {TrustManager[] trustAllCerts = new TrustManager[] {new X509TrustManager(){public X509Certificate[] getAcceptedIssuers() {return new X509Certificate[] {};}public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {}public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {}}};/*SSLContext 使用上述的 TrustManager 初始化一個 SSLContext 實例并將其設置為 HttpsURLConnection 的默認 SSLSocketFactory這允許 HttpsURLConnection 信任所有SSL證書TLS是握手協議的一種*/try {SSLContext sc = SSLContext.getInstance("TLS");sc.init(null, trustAllCerts, new SecureRandom());HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());}catch (Exception e) {e.printStackTrace();}}/*** 發出請求的具體方法* @param urlPath  https協議接口的路徑 https://xxxxxx* @param Json  發出請求需要攜帶的參數,需要是Json格式* @return*/public static String doPostToJson(String urlPath, String Json) {String result = "";BufferedReader reader = null;HttpURLConnection conn = null;try {/*掉用上面的靜態方法,使得請求發出時,作為調用者的我們對服務端所擁有的任何https證書都是兼容的這里說一句題外話:一般情況下,作為接口使用者trustAllHosts方法里面的代碼是不變的,因為你作為使用者總沒道理說讓人家服務端兼容你什么,除非你是證書的使用者,不過這種情況會有證書廠商告訴你如何做,不得不說廠商服務是個好東西*/trustAllHosts();URL url = new URL(urlPath);/*如果協議是 https,則使用 HttpsURLConnection 并設置 HostnameVerifier 為 DO_NOT_VERIFY。否則,使用 HttpURLConnection*/if (url.getProtocol().toLowerCase().equals("https")) {HttpsURLConnection httpsConn = (HttpsURLConnection) url.openConnection();httpsConn.setHostnameVerifier(DO_NOT_VERIFY);conn = httpsConn;}else {conn = (HttpURLConnection) url.openConnection();}// 設置請求以POST形式發出conn.setRequestMethod("POST");// 是否攜帶請求提,POST和GET請求必須為trueconn.setDoOutput(true);// 是否會獲取服務端的響應,默認是trueconn.setDoInput(true);//禁用緩存conn.setUseCaches(false);// Keep-Alive告訴服務端對已有的TCP連接保持一定時間的活性,以保障后續發出的請求不需要建立新的TCP連接,從而減少網絡開銷conn.setRequestProperty("Connection", "Keep-Alive");//字符集,這個配置不是標準的請求頭,但是有些妖孽系統會讀取這個conn.setRequestProperty("Charset", "UTF-8");// 這個是請求格式,告訴服務端這個請求發送的是Json數據以及字符集conn.setRequestProperty("Content-Type", "application/json; charset=UTF-8");// 告訴服務端,相應格式也希望是json格式conn.setRequestProperty("accept", "application/json");//如果參數不為空則將參數以字節數流的方式寫入請求體里面if (Json != null) {byte[] writebytes = Json.getBytes();conn.setRequestProperty("Content-Length", String.valueOf(writebytes.length));OutputStream outwritestream = conn.getOutputStream();outwritestream.write(Json.getBytes());outwritestream.flush();outwritestream.close();}//讀取響應,相應數據也是一個jsonif (conn.getResponseCode() == 200) {reader = new BufferedReader(new InputStreamReader(conn.getInputStream(), "utf-8"));result = reader.readLine();}}catch (Exception e) {e.printStackTrace();}finally {//讀取相應用的輸入流需要在這里關閉,而寫入請求參數的輸出流是隨用隨關的if (reader != null) {try {reader.close();conn.disconnect();}catch (IOException e) {e.printStackTrace();}}}return result;}}

對于上面的代碼,重點要說明的第一點是HostnameVerifier接口提供的方法,它主要用于訪問https協議下的接口時,驗證當前已和你建立連接的hostname(主機名)和連接的SSLSession(SSL會話)證書是否匹配,防止中間人攻擊,比如可以如下操作

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLSession;
import java.io.IOException;
import java.net.URL;public class HostnameVerifierExample {public static void main(String[] args) {try {// 創建一個URL對象URL url = new URL("https://xxxxx");// 打開HTTPS連接HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();// 設置自定義的HostnameVerifierHostnameVerifier customVerifier = new HostnameVerifier() {@Overridepublic boolean verify(String hostname, SSLSession session) {// 在這里實現你的驗證邏輯// 例如,你可以比較hostname和session中的證書信息// 為了簡單起見,這里我們直接接受任何主機名(不推薦這樣做,有安全風險)// 在實際應用中,你應該根據你的安全策略來實現這個邏輯// 比如,你可以檢查hostname是否與你預期的服務器主機名匹配// 或者,你可以使用HttpsURLConnection.getDefaultHostnameVerifier()來獲取默認的驗證器,并基于它的結果進行擴展// 這是一個不安全的示例,僅用于說明如何使用verify方法// 在實際應用中,你應該避免這樣做return true; // 更安全的做法可能是這樣的:// if ("expected.hostname".equals(hostname)) {//     return true;// } else {//     HostnameVerifier defaultVerifier = HttpsURLConnection.getDefaultHostnameVerifier();//     return defaultVerifier.verify(hostname, session);// }}};// 設置自定義的HostnameVerifier到連接中connection.setHostnameVerifier(customVerifier);// 繼續處理HTTPS連接,比如讀取響應等// ...// 關閉連接connection.disconnect();} catch (IOException e) {e.printStackTrace();}}
}

第二是trustAllHosts方法里面的東西,TrustManager是用來實現證書驗證的類,X509TrustManager是X.509 證書的驗證實現,通俗的講是一個基礎的證書,因此我上面的代碼中也說了,如果你是正式的https證書使用者,會有廠商服務告訴你怎么驗證證書,在X509TrustManager 中提供了三個方法

getAcceptedIssuers():返回此信任管理器接受的發行者證書(根證書或中間證書)數組。在上面的代碼中,這個方法返回了一個空數組,意味著它不做任何特定的發行者證書獲取checkServerTrusted(X509Certificate[] certs, String authType):驗證服務器提供的證書鏈是否可信。在代碼中,這個方法被空實現了,意味著不會進行任何驗證。checkClientTrusted(X509Certificate[] certs, String authType):驗證客戶端提供的證書鏈是否可信(在需要客戶端證書的情況下)。同樣,在代碼中,這個方法也被空實現了

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/66804.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/66804.shtml
英文地址,請注明出處:http://en.pswp.cn/web/66804.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

禁止 iOS 系統瀏覽器雙指放大頁面

網上找到禁止ios縮放的方法基本都試過了,但是還是有bug,如標題所示,下面我將總結一下禁止ios縮放,雙擊縮放的方法。 方法一 在 iOS 10之前&#xff0c;iOS 和 Android 都可以通過一行 meta 標簽來禁止頁面縮放&#xff1a; <meta content"widthdevice-width, initia…

讀西瓜書的數學準備

1&#xff0c;高等數學&#xff1a;會求偏導數就行 2&#xff0c;線性代數&#xff1a;會矩陣運算就行 參考&#xff1a;線性代數--矩陣基本計算&#xff08;加減乘法&#xff09;_矩陣運算-CSDN博客 3&#xff0c;概率論與數理統計&#xff1a;知道啥是隨機變量就行

PLC通信

PLC&#xff08;可編程邏輯控制器&#xff09;通信是指 PLC 與其他設備或系統之間進行數據傳輸和信息交換的過程 一、PLC通信方式 1 &#xff09;串行通信 數據按位順序依次傳輸&#xff0c;只需要一對傳輸線&#xff0c;成本低&#xff0c;傳輸距離長&#xff0c;但速度相對…

C/C++、網絡協議、網絡安全類文章匯總

&#x1f6f8; 文章簡介 本文章主要對本博客的所有文章進行了匯總&#xff0c;方便查找。內容涉及C/C編程&#xff0c;CMake、Makefile、Shell腳本&#xff0c;GUI編程框架MFC和QT&#xff0c;Git版本控制工具&#xff0c;網絡協議基礎知識&#xff0c;網絡安全領域相關知識&a…

java 中多線程、 隊列使用實例,處理大數據業務

場景&#xff1a; 從redis 訂閱數據 調用線程來異步處理數據 直接上代碼 定義線程管理類 import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeansException; import org.springframework.beans.factory.BeanFactory; import org…

【自動駕駛】4 智駕生態概述

目錄 1 智駕生態概述 ▲ 關鍵組成部分 ▲ 概述 2 關鍵技術 ▲ 傳感器 ▲ 感知 ▲ 數據閉環 3 未來市場 1 智駕生態概述 智能駕駛生態&#xff0c;簡稱智駕生態&#xff0c;是指圍繞智能駕駛技術的開發、應用、服務和支持所形成的產業體系和合作網絡。 涵蓋了從硬件設…

2025.1.20——一、[RCTF2015]EasySQL1 二次注入|報錯注入|代碼審計

題目來源&#xff1a;buuctf [RCTF2015]EasySQL1 目錄 一、打開靶機&#xff0c;整理信息 二、解題思路 step 1&#xff1a;初步思路為二次注入&#xff0c;在頁面進行操作 step 2&#xff1a;嘗試二次注入 step 3&#xff1a;已知雙引號類型的字符型注入&#xff0c;構造…

”彩色的驗證碼,使用pytesseract識別出來的驗證碼內容一直是空“的解決辦法

問題&#xff1a;彩色的驗證碼&#xff0c;使用pytesseract識別出來的驗證碼內容一直是空字符串 原因&#xff1a;pytesseract只識別黑色部分的內容 解決辦法&#xff1a;先把彩色圖片精確轉換成黑白圖片。再將黑白圖片進行反相&#xff0c;將驗證碼部分的內容變成黑色&#…

Unity3D項目開發中的資源加密詳解

前言 在Unity3D游戲開發中&#xff0c;保護游戲資源不被非法獲取和篡改是至關重要的一環。資源加密作為一種有效的技術手段&#xff0c;可以幫助開發者維護游戲的知識產權和安全性。本文將詳細介紹Unity3D項目中如何進行資源加密&#xff0c;并提供相應的技術詳解和代碼實現。…

RabbitMQ 在實際應用時要注意的問題

1. 冪等性保障 1.1 冪等性介紹 冪等性是數學和計算機科學中某些運算的性質,它們可以被多次應?,?不會改變初始應?的結果. 應?程序的冪等性介紹 在應?程序中,冪等性就是指對?個系統進?重復調?(相同參數),不論請求多少次,這些請求對系統的影響都是相同的效果. ?如數據庫…

AIGC視頻生成明星——Emu Video模型

大家好&#xff0c;這里是好評筆記&#xff0c;公主號&#xff1a;Goodnote&#xff0c;專欄文章私信限時Free。本文詳細介紹Meta的視頻生成模型Emu Video&#xff0c;作為Meta發布的第二款視頻生成模型&#xff0c;在視頻生成領域發揮關鍵作用。 &#x1f33a;優質專欄回顧&am…

Debian 上安裝PHP

1、安裝軟件源拓展工具 apt -y install software-properties-common apt-transport-https lsb-release ca-certificates 2、添加 Ond?ej Sur 的 PHP PPA 源&#xff0c;需要按一次回車&#xff1a; add-apt-repository ppa:ondrej/php 3、更新軟件源緩存&#xff1a; apt-g…

office 2019 關閉word窗口后卡死未響應

最近關閉word文件總是出現卡死未響應的狀態&#xff0c;必須從任務管理器才能殺掉word 進程&#xff0c;然后重新打開word再保存&#xff0c;很是麻煩。&#xff08;#其他特征&#xff0c;在word中打字會特別變慢&#xff0c;敲擊鍵盤半秒才出現字符。&#xff09; office官網…

SecureUtil.aes數據加密工具類

數據加密、解密工具類 包含map和vo的數據轉換 import cn.hutool.core.bean.BeanUtil; import cn.hutool.crypto.SecureUtil;import java.util.HashMap; import java.util.Map;/*** 數據解析**/ public class ParamUtils {/*** 數據解密** param params 參數* param secretKe…

機器學習:支持向量機

支持向量機&#xff08;Support Vector Machine&#xff09;是一種二類分類模型&#xff0c;其基本模型定義為特征空間上的間隔最大的廣義線性分類器&#xff0c;其學習策略便是間隔最大化&#xff0c;最終可轉化為一個凸二次規劃問題的求解。 假設兩類數據可以被 H x : w T x…

SQL-leetcode—1148. 文章瀏覽 I

1148. 文章瀏覽 I Views 表&#xff1a; ---------------------- | Column Name | Type | ---------------------- | article_id | int | | author_id | int | | viewer_id | int | | view_date | date | ---------------------- 此表可能會存在重復行。&#xff08;換句話說…

k8s資源預留

k8s資源預留 https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/reserve-compute-resources/ vim /var/lib/kubelet/config.yamlenforceNodeAllocatable: - pods kubeReserved: # 配置 kube 資源預留cpu: 500mmemory: 1Giephemeral-storage: 1Gi systemReserved: #…

[STM32 HAL庫]串口空閑中斷+DMA接收不定長數據

一、空閑中斷 STM32的串口具有空閑中斷&#xff0c;什么叫做空閑呢&#xff1f;如何觸發空閑中斷呢&#xff1f; 空閑&#xff1a;串口發送的兩個字符之間間隔非常短&#xff0c;所以在兩個字符之間不叫空閑。空閑的定義是總線上在一個字節的時間內沒有再接收到數據。觸發條件…

Unity Line Renderer Component入門

Overview Line Renderer 組件是 Unity 中用于繪制連續線段的工具。它通過在三維空間中的兩個或兩個以上的點的數組&#xff0c;并在每個點之間繪制一條直線。可以繪制從簡單的直線到復雜的螺旋線等各種圖形。 1. 連續性和獨立線條 連續性&#xff1a;Line Renderer 繪制的線條…

純 Python、Django、FastAPI、Flask、Pyramid、Jupyter、dbt 解析和差異分析

一、純 Python 1.1 基礎概念 Python 是一種高級、通用、解釋型的編程語言&#xff0c;以其簡潔易讀的語法和豐富的標準庫而聞名。“純 Python” 在這里指的是不依賴特定的 Web 框架或數據分析工具&#xff0c;僅使用 Python 原生的功能和標準庫來開發應用程序或執行任務。 1.…