在Java中以字符串形式讀取HTTP響應正文
- java
- Spring
1.簡介
在本教程中,我們將探索幾個庫,用於在Java中將HTTP響應正文作為字符串讀取。從第一個版本開始,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主要包括三個核心類: HttpClient
, HttpRequest
和HttpResponse
。
HttpResponse
描述了HttpRequest
調用的結果。 HttpResponse
不是直接創建的,當正文被完全接收後才可以使用。
要將響應主體讀取為String,
我們首先需要創建簡單的客戶端和請求對象:
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(DUMMY_URL))
.build();
然後,我們僅使用BodyHandlers
並調用ofString()
方法以返迴響應:
HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString());
3. HttpURLConnection
HttpURLConnection
是一個輕量級的HTTP客戶端,用於通過HTTP或HTTPS協議訪問資源,並允許我們創建InputStream
。一旦獲得InputStream,
我們就可以像讀取普通的本地文件一樣讀取它。
在Java中,可用於訪問Internet的主要類是java.net.URL
類和java.net.HttpURLConnection
類。首先,我們將使用URL
類來指向Web資源。然後,我們可以使用HttpURLConnection
類訪問它。
URL
以String
獲取響應主體,我們首先應使用URL
創建一個HttpURLConnection
:
HttpURLConnection connection = (HttpURLConnection) new URL(DUMMY_URL).openConnection();
new URL(DUMMY_URL).openConnection()
返回HttpURLConnection
。這個對象允許我們添加標題或檢查響應代碼。
接下來,讓我們從connection
**對象獲取InputStream
**
InputStream inputStream = connection.getInputStream();
最後,我們需要將InputStream
轉換為String
。
4. Apache HttpClient
在本節中,我們將看到如何使用Apache HttpClient
讀取HTTP響應正文作為字符串。
要使用此庫,我們需要將其依賴項添加到我們的Maven項目中:
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.12</version>
</dependency>
我們可以**CloseableHttpClient
類檢索和發送數據**。要使用默認配置創建它的實例,我們可以使用HttpClients.createDefault()
。
CloseableHttpClient
提供了一種execute
方法來發送和接收數據。此方法使用類型為HttpUriRequest
的參數,該參數具有許多子類,包括HttpGet
和HttpPost
。
首先創建一個HttpGet
對象:
HttpGet request = new HttpGet(DUMMY_URL);
其次,讓我們創建客戶端:
CloseableHttpClient client = HttpClients.createDefault();
第三,我們execute
方法的結果中檢索響應對象:
CloseableHttpResponse response = client.execute(request);
最後,我們通過**將響應實體轉換為String
**來返迴響應主體:
HttpEntity entity = response.getEntity();
String result = EntityUtils.toString(entity);
5. Spring RestTemplate
在本節中,我們將看到如何使用Spring RestTemplate
讀取HTTP響應主體作為字符串。
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);
六,結論
在本文中,我們已經看到瞭如何使用多個庫以String
讀取HTTP響應正文。