Java 原生 HTTP Client

??介紹

Java 原生 HttpClient 是從 Java 11 開始引入的標準庫,用于簡化 HTTP 請求的發送與響應處理。它支持同步和異步請求,并內置對 HTTP/1.1 和 HTTP/2 協議的支持。HttpClient 提供了易用的 API 來設置請求頭、請求體、處理響應以及配置 SSL/TLS 加密等安全功能。

?


?

一個簡單的例子

發送 GET 請求并將打印 Response

HttpClient client = HttpClient.newBuilder().build();
HttpRequest request = HttpRequest.newBuilder().uri(URI.create("http://localhost:8080/get")).GET().build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());System.out.println(response.statusCode());
System.out.println(response.headers());
System.out.println(response.body());

?


?

核心對象

HttpClient

要發送請求,首先需要通過其構建器創建一個 HttpClient?實例。構建器允許配置客戶端的各種狀態,例如 HTTP 協議版本、是否重定向、超時設置、代理、身份驗證等等,從而定制每個客戶端的行為。

HttpClient client = HttpClient.newBuilder().version(HttpClient.Version.HTTP_2).followRedirects(HttpClient.Redirect.NORMAL).proxy(ProxySelector.of(new InetSocketAddress("www-proxy.com", 8080))).connectTimeout(Duration.ofMillis(200)).authenticator(Authenticator.getDefault()).build();


HttpRequest

HttpRequest 扮演著構建和配置 HTTP 請求的角色,,包括設置請求的 URL、請求方法(如 GET、POST、PUT 等)、請求頭、請求體、超時時間等。HttpRequest 是不可變的,一旦創建后無法修改,只能通過 HttpRequest 的構建器來創建一個定制的請求對象。

HttpRequest request = HttpRequest.newBuilder().uri(URI.create("http://localhost:8080/get")).GET().build();HttpRequest request = HttpRequest.newBuilder().uri(URI.create("http://localhost:8080/post")).header("Content-Type", "application/json").POST(HttpRequest.BodyPublishers.noBody()).timeout(Duration.ofMinutes(1)).build();

?

HttpResponse

HttpResponse 用于表示 HTTP 請求的響應。它封裝了 HTTP 響應的狀態碼、響應體、響應頭、請求 URI、HTTP 協議版本等等。

HttpResponse 的常用方法

  • statusCode():獲取 HTTP 響應的狀態碼。
  • body():獲取響應體內容。
  • headers():獲取所有響應頭。
  • uri():獲取響應對應的請求 URI。
  • version():獲取響應使用的 HTTP 協議版本。

響應體的處理

響應體是通過 HttpResponse.BodyHandler 來處理的。HttpResponse.BodyHandler 是一個接口,用來定義如何處理響應體的內容。常用的 BodyHandler 有:

  • BodyHandlers.ofString():將響應體處理為字符串(適用于文本響應)
  • BodyHandlers.ofByteArray():將響應體處理為字節數組(適用于二進制數據,如文件下載)。
  • BodyHandlers.ofInputStream():將響應體處理為 InputStream(適用于流式處理)。
  • BodyHandlers.ofFile():將響應體直接寫入文件(適用于文件下載等場景)。

?



同步和異步

同步

同步 HttpClient 通過調用 send() 方法來發送請求并等待響應。在請求完成之前,當前線程會被阻塞,即線程會等待直到 HTTP 響應返回并處理結果。

上文給出的例子都是同步請求

特點:

  • 阻塞:當前線程會等待直到請求完成并獲取響應。
  • 順序執行:代碼會按順序執行,每個請求都必須等待前一個請求完成。
  • 適用場景:適合較少的并發請求,或者請求和響應的順序很重要時。

異步

通過調用 sendAsync() 方法來發送請求,該方法立即返回一個 CompletableFuture,而不是直接返回響應。請求會在后臺線程中執行,主線程不會被阻塞。你可以使用 thenAccept()、thenApply() 等方法來處理響應。

特點:

  • 非阻塞:不會阻塞當前線程,任務在后臺異步執行。
  • 并發執行:允許多個請求并行執行,可以提高效率,尤其是處理大量并發請求時。
  • 適用場景:適用于 I/O 密集型任務,如發送多個請求、等待多個響應時。
HttpClient client = HttpClient.newBuilder().build();
HttpRequest request = HttpRequest.newBuilder().uri(URI.create("http://localhost:8080/get")).GET().build();CompletableFuture<HttpResponse<String>> completableFutureResponse = client.sendAsync(request, HttpResponse.BodyHandlers.ofString());
HttpResponse<String> response = completableFutureResponse.get();

?



身份驗證器

Authenticator 是 HttpClient 中用來為 HTTP 請求提供身份驗證信息的核心類。Authenticator 的工作原理是基于 認證挑戰(Authentication Challenge)機制。認證過程的基本步驟如下:

  1. 客戶端發送請求:客戶端向服務器發出一個 HTTP 請求,可能是沒有認證信息的請求。
  2. 服務器返回認證挑戰:如果目標資源需要認證,服務器會返回一個 401 Unauthorized 或 407 Proxy Authentication Required 響應,這兩者都表明客戶端沒有提供有效的身份認證信息。
  3. Authenticator 觸發:當 HttpClient 遇到需要認證的響應時,它會調用 Authenticator 的 getPasswordAuthentication() 方法。這是通過一個回調機制觸發的,Authenticator 可以返回包含用戶名和密碼的 PasswordAuthentication 對象。
  4. 客戶端再次發送帶認證信息的請求:客戶端將返回的認證信息(如用戶名和密碼)包含在 HTTP 請求的 Authorization 頭部中,再次發送給服務器。
  5. 認證通過:如果服務器驗證通過,返回相應的資源;否則驗證失敗。

注意:Authenticator 類的設計初衷是為了支持 HTTP 基本認證(Basic Authentication)和 代理認證(Proxy Authentication)等標準認證機制。對于 JWT 認證方式,并沒有提供自動刷新。

?


?

參考

Introduction to the Java HTTP Client

??

?

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

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

相關文章

【C語言刷題】第十天:加量加餐繼續,代碼題訓練,融會貫通IO模式

&#x1f525;個人主頁&#xff1a;艾莉絲努力練劍 ?專欄傳送門&#xff1a;《C語言》、《數據結構與算法》、C語言刷題12天IO強訓、LeetCode代碼強化刷題 &#x1f349;學習方向&#xff1a;C/C方向 ??人生格言&#xff1a;為天地立心&#xff0c;為生民立命&#xff0c;為…

【WEB】Polar靶場 6-10題 詳細筆記

六.jwt 這題我又不會寫 先來了解下jwt **JWT&#xff08;JSON Web Token&#xff09;**是一種基于JSON的開放標準&#xff08;RFC 7519&#xff09;&#xff0c;主要用于在網絡應用環境間傳遞聲明信息。JWT通常用于身份驗證和信息交換&#xff0c;確保在各方之間安全地傳輸信…

高階亞馬遜運營秘籍:關鍵詞矩陣打法深度解析與應用

當競爭對手還在為單個大詞競價廝殺時&#xff0c;頭部賣家已悄然構建了一張覆蓋數千長尾關鍵詞的隱形網絡&#xff0c;精準觸達每一個細分需求&#xff0c;以更低的成本撬動更高的轉化率在亞馬遜流量紅利消退、廣告成本高企的2025年&#xff0c;傳統“爆款關鍵詞”打法已顯疲態…

【問題解決】org.springframework.web.util.NestedServletException Handler dispatch failed;

詳細異常信息&#xff1a; org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.NoClassDefFoundError: javax/xml/bind/DatatypeConverter at org.springframework.web.servlet.DispatcherServlet.doDispatch(Disp…

【已解決】mac 聚焦搜索設置了edge 的地址欄搜索為google,還是跳轉到百度

問題詳情&#xff1a;在macbook的聚焦搜索中點擊edge搜索的時候&#xff0c;跳轉到了百度&#xff0c;即使已經將地址欄的搜索引擎設置為了goole&#xff0c;但是還是會跳轉到百度。解決方案&#xff1a;1、打開safari瀏覽器。&#xff08;看清了&#xff0c;是打開Safari&…

MimicMotion 讓你的圖片動起來

MimicMotion 是由騰訊公司推出的一款人工智能人像動態視頻生成框架。可以模仿視頻動作再讓圖片模仿動作姿態&#xff0c;最后生成視頻。 MimicMotion 的核心在于其置信度感知的姿態引導技術&#xff0c;確保視頻幀的高質量和時間上的平滑過渡。 以前咱們也手搭過Animate-X讓圖…

云計算考核 - 分析電子銀行需求采用微服務架構對系統進行設計

二、使用的技術以及分析 微服務&#xff08;Microservices&#xff09;是一種架構風格&#xff0c;一個大型復雜軟件應用由一個或多個微服務組成。系統中的各個微服務可被獨立部署&#xff0c;各個微服務之間是松耦合的。每個微服務僅關注于完成一件任務并很好地完成該任務。在…

Ionic 安裝使用教程

一、Ionic 簡介 Ionic 是一個基于 Web 技術&#xff08;HTML、CSS、JavaScript&#xff09;的跨平臺移動應用開發框架&#xff0c;結合 Angular、React 或 Vue 可快速構建 iOS 和 Android 應用。Ionic 提供豐富的 UI 組件、命令行工具及原生插件封裝&#xff0c;廣泛用于混合應…

滲透測試 - 簡介

Web滲透測試簡介 Web滲透測試&#xff08;Penetration Testing&#xff09;是一種模擬黑客攻擊的安全評估方法&#xff0c;旨在發現Web應用程序中的漏洞&#xff0c;幫助開發者修復問題并提升系統安全性。它涉及主動測試目標系統&#xff08;如網站或API&#xff09;的弱點&am…

云原生AI研發體系建設路徑

當AI遇上云原生&#xff0c;就像咖啡遇上牛奶&#xff0c;總能擦出不一樣的火花 ?? &#x1f4cb; 文章目錄 引言&#xff1a;為什么要建設云原生AI研發體系整體架構設計&#xff1a;搭建AI研發的"樂高積木"技術棧選擇&#xff1a;選擇合適的"武器裝備"…

【網絡安全】深入理解 IoC 與 IoA:從“事后識別”到“事前防御”

1. 簡介 在網絡安全領域&#xff0c;IoC&#xff08;Indicators of Compromise&#xff0c;入侵指標&#xff09; 和 IoA&#xff08;Indicators of Attack&#xff0c;攻擊指標&#xff09; 是兩個核心概念。它們是安全分析師識別攻擊行為、調查事件、制定防御策略的重要依據…

貪心專題練習

牛牛學括號題目要求每次操作必須刪除一個左括號和一個右括號&#xff0c;且刪除后序列仍需合法。合法的括號序列要求每個右括號之前必須有對應的左括號。分析輸入的都是合法的括號&#xff0c;即左括號右括號&#xff0c;可利用這一點去解題注意&#xff1a;中間取模是必要的&a…

屏幕分辨率修改工具 SwitchResX(Mac電腦)

蘋果電腦屏幕分辨率修改工具&#xff0c;SwitchResX for Mac&#xff0c;可以為您提供控制顯示器分辨率所需的工具和功能。 原文地址&#xff1a;屏幕分辨率修改工具 SwitchResX&#xff08;Mac電腦&#xff09;

【Java編程動手學】Java中的數組與集合

文章目錄 一、Java數組基礎1.1 數組結構概述1.2 一維數組1.2.1 聲明與初始化1.2.2 訪問與修改元素1.2.3 數組遍歷 1.3 二維數組1.3.1 聲明與初始化1.3.2 訪問與遍歷 1.4 三維數組及更高維數組1.5 數組類(Arrays)1.5.1 常用方法 1.6 復制數組1.6.1 系統復制方法1.6.2 手動復制 二…

Linux在線安裝docker

1.切換阿里云鏡像源 備份原有 repo 文件 sudo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 下載阿里云的 CentOS 7 repo 文件 sudo curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo 清華 sudo…

第十五節:第四部分:特殊文件:XML的生成、約束(了解即可)

如何使用程序把數據寫出到XML文件中去 什么是約束XML的書寫(了解即可) DTD約束文檔的使用(了解即可) schema約束文檔的使用(了解即可) 代碼&#xff1a;如何使用程序把數據寫出到XML文件中去 package com.itheima.day2_xml;import java.io.BufferedWriter; import java.io.Fil…

cd-agent更換cd模型(自用)

需求&#xff1a;將12服務器上&#xff0c;原有的cd-agent&#xff08;目錄為/home/xgq/agent&#xff09;&#xff0c;復制一份&#xff0c;重命名為/home/xgq/agent_lx。之前的推理流程是A B兩張圖輸進去&#xff0c;通過clip模型進行領域分類&#xff0c;若是遙感領域就用ch…

微信小程序31~40

1.事件綁定和事件對象 小程序中綁定事件沒有on 方式&#xff0c;也沒有click,小程序中可以用bind方法&#xff0c;click事件也需要用tap事件來進行代替。 綁定事件分為兩種&#xff1a; bind:事件名&#xff0c;eg: <view bind:tap"fnName"><view/>bind事…

二叉樹題解——二叉樹的直徑【LeetCode】

543. 二叉樹的直徑 一、算法邏輯&#xff08;逐步通順講解每一步思路&#xff09; &#x1f3af; 問題目標&#xff1a; 求二叉樹中任意兩個節點之間的最長路徑&#xff08;以邊數計算&#xff09;。 ? 1?? 初始化變量 ans 用于記錄目前遍歷過程中的最大直徑&#xff08;…

Android開發 Android10及10+讀取外部存儲問題

前提 &#xff1a; 在做文件遍歷時&#xff0c;有的文件在Android10無法訪問&#xff0c;在注冊清單下添加android:requestLegacyExternalStorage"true"后可正常訪問&#xff0c;但一直不知道具體原因。 使用XXPermissions時讀到Android10分區存儲后才明白這里的邏輯…