在Java中將HTTP響應體作為字符串讀取

HTTP Client-Side,REST,Spring Boot
Remote
1
07:35 AM · Dec 01 ,2025

1. 簡介

在本教程中,我們將探索用於將 HTTP 響應主體作為字符串讀取的 Java 庫。自 Java 的早期版本以來,Java 已經提供了 HttpURLConnection API。它僅包含基本功能,並且以其不夠用户友好的特性而聞名。

在 JDK 11 中,Java 引入了新的、改進的 HttpClient API,用於處理 HTTP 通信。我們將討論這些庫,並查看替代方案,例如 Apache HttpClient 和 Spring Rest Template。

2. HttpClient

如前所述,HttpClient 已添加到 Java 11。它允許我們訪問網絡上的資源,但與 HttpURLConnection 不同,HttpClient 支持 HTTP/1.1 和 HTTP/2。 此外,它提供同步和異步請求類型

HttpClient 提供了一個現代 API,具有靈活性和強大的功能。 此 API 由三個核心類組成:HttpClientHttpRequestHttpResponse。

HttpResponse 描述了 HttpRequest 調用 的結果。 HttpResponse 不直接創建,並在接收到正文內容後可用。

要將響應正文讀取為 String,我們需要首先創建簡單的客户端和請求對象:

HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create(DUMMY_URL))
    .build();

然後,我們將使用 BodyHandlersofString()HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString());

3. HttpURLConnection

HttpURLConnection 是一個輕量級的 HTTP 客户端,用於通過 HTTP 或 HTTPS 協議訪問資源,並且它允許我們創建 InputStream。 獲得 InputStream 後,我們可以像讀取普通本地文件一樣讀取它。

在 Java 中,我們可以使用到的主要類是 java.net.URL 類和 java.net.HttpURLConnection 類。 首先,我們將使用 java.net.URL 類來指向一個 Web 資源。 然後我們可以使用 java.net.HttpURLConnection 類來訪問它。

要獲取來自 java.net.URL 的響應正文作為 String,我們應該首先使用我們的 java.net.URL 創建一個 HttpURLConnection

HttpURLConnection connection = (HttpURLConnection) new URL(DUMMY_URL).openConnection();

The java.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URL 的 java.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URLjava.net.URL>

This code snippet appears to be a placeholder or a comment indicating that the code is not yet implemented. It's often used to mark a section of code that will be added later. **Explanation:** * **`//` (Double Slash):** This is the standard comment syntax in many programming languages (including JavaScript, Java, C++, Python, etc.). * **Purpose:** Comments are used to explain the code, make it more readable, or temporarily disable code without deleting it. **How it's used:** 1. **Placeholder:** When you're writing code and haven't yet implemented a particular feature, you might use a comment like this to indicate where the code will go. 2. **Explanation:** You can use comments to explain what a particular section of code does. 3. **Temporary Disable:** You can temporarily disable code by adding a comment. **Example (JavaScript):** javascript // This is a comment function myFunction() { // This is also a comment console.log("Hello, world!"); } **In your specific case:** The `// This code is not yet implemented.` is a placeholder. It's a signal that you'll be adding the actual code to perform the desired action later.

4. Apache HttpClient

在本節中,我們將學習如何使用 Apache HttpClient 來將 HTTP 響應體讀取為字符串。

為了使用這個庫,我們需要將它的依賴項添加到我們的 Maven 項目中:

<dependency>
    <groupId>org.apache.httpcomponents.client5</groupId>
    <artifactId>httpclient5</artifactId>
    <version>5.2</version>
</dependency>

我們可以使用 CloseableHttpClient 類來檢索和發送數據。要創建一個它的實例,並使用默認配置,我們可以使用 HttpClients.createDefault()

CloseableHttpClient 提供一個 execute 方法來發送和接收數據。這個方法使用 2 個參數。第一個參數的類型是 HttpUriRequest,它有許多子類,包括 HttpGetHttpPost

首先,我們將創建一個 HttpGet 對象:

HttpGet request = new HttpGet(DUMMY_URL);

其次,我們將創建客户端:

CloseableHttpClient client = HttpClients.createDefault();

最後,我們將從 execute 方法的結果中檢索響應對象:

String response = client.execute(request, new BasicHttpClientResponseHandler());
logger.debug("Response -> {}", response);

這裏我們使用了 BasicHttpClientResponseHandler,它返回響應體作為字符串。

5. Spring RestTemplate

在本節中,我們將演示如何使用 Spring RestTemplate 讀取 HTTP 響應主體為字符串。請注意,RestTemplate 現在已棄用。因此,我們應該考慮使用 Spring WebClient,如下一節所述。

RestTemplate 類是 Spring 提供的一個基本工具,它提供了一個簡單的模板,用於在底層的 HTTP 客户端庫(如 JDK HttpURLConnection、Apache HttpClient)上進行客户端 HTTP 操作。

RestTemplate 提供了 一些有用的方法,用於創建 HTTP 請求和處理響應。

我們可以通過首先將一些依賴項添加到我們的 Maven 項目來使用這個庫:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <version>${spring-boot.version}</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <version>${spring-boot.version}</version>
    <scope>test</scope>
</dependency>

為了進行 Web 請求並以字符串形式返回響應主體,我們將 創建 RestTemplate 實例:

RestTemplate restTemplate = new RestTemplate();

然後我們將 通過調用 getForObject() 方法來獲取響應對象,並傳入 URL 和所需的響應類型。 我們將在示例中使用 String.class

String response = restTemplate.getForObject(DUMMY_URL, String.class);

6. Spring WebClient

最後,我們將看到如何使用 Spring WebClient,這是一個反應式、非阻塞的解決方案,替代了 Spring RestTemplate

我們可以通過將 spring-boot-starter-webflux 依賴添加到 Maven 項目中來使用這個庫:


<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-webflux</artifactId>
</dependency>

執行最簡單的 HTTP Get 請求的方法是使用 create 方法:

WebClient webClient = WebClient.create(DUMMY_URL);

執行最簡單的 HTTP Get 請求的方法是調用 getretrieve 方法。然後我們使用 bodyToMono 方法,類型為 String.class,來提取 body 為單個 String 實例:

Mono<String> body = webClient.get().retrieve().bodyToMono(String.class);

最後,我們調用 block 方法,告訴 Web Flux 等待整個 body 流被讀取並複製到 String 結果中:

String s = body.block();

7. 結論

在本文中,我們學習瞭如何使用多個庫將 HTTP 響應體讀取為 String

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.