使用 Java 中的 Jsoup 將資料發佈到網站
1.概述
Jsoup是一個開源 Java 函式庫,主要用於從 HTML 中提取資料。它還允許您操作和輸出 HTML。它擁有穩定的開發流程、完善的文件以及流暢靈活的 API。
除了抓取網頁和操作 HTML 之外,它還提供了用於發出 HTTP 請求的便捷 API。
在本文中,我們將使用 Jsoup 的Connection
API 將資料發佈到網站,並使用httpbin.org
上的公共虛擬 API 測試 POST 請求。
2. Maven依賴
要使用jsoup
函式庫,我們需要在pom.xml
中加入以下相依性:
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.21.2</version>
</dependency>
我們可以在 Maven Central 儲存庫中找到Jsoup庫的最新版本。
3.發送POST請求
Jsoup 的Connection
介面是一個 HTTP 用戶端,它從 Web 取得內容並將其解析為 Documents。它允許我們將 Jsoup 配置為一個可以提交資料的客戶端。讓我們來看看下面的方法,以詳細了解這一點:
public String sendPost(String url, Map<String, String> headers, String jsonPayload) throws Exception {
Connection.Response response = Jsoup.connect(url)
.headers(headers)
.requestBody(jsonPayload)
.method(Connection.Method.POST)
.ignoreContentType(true)
.execute();
return response.body();
}
3.1. 準備請求
我們將使用Jsoup.connect().
這將為給定的url.
此連接物件將充當builder
,允許我們在執行請求之前添加更多詳細資訊。
通常,HTTP 請求中的標頭會充當元資料。它們包含諸如身份驗證詳細資訊、內容類型、版本等資訊。我們可以使用 .headers headers(headers).
我們可以使用.requestBody(jsonPayload).
會直接傳送我們提供的原始 JSON,而不會修改資料主體。之後,我們需要使用.method().
預設情況下,Jsoup 會採用 GET 請求。我們可以透過將方法設定為Connection.Method.POST
來覆寫此行為.
3.2. 處理響應
Jsoup 通常使用 HTML 並期望 HTML 回應,而 API 通常會傳回 JSON 回應。 Connection Connection
的ignoreContentType()
方法用於控制 Jsoup 如何處理 Content-Type 回應頭。
預設情況下, ignoreContentType
設定為false.
**這意味著 Jsoup 會檢查回應頭的 Content-Type。如果它不是可識別的文字格式,例如*application/html、text/\ 或 application/xml,則會拋出**UnsupportedMimeTypeException.
**
我們的伺服器傳回純文字或 JSON,因此我們將ignoreContentType
設為true.
這樣,Jsoup 就不會強制回傳純 HTML 格式的回應。這樣,我們就可以處理 JSON、XML 或 API 傳回的任何其他資料類型。
3.3. 執行調用
到目前為止,我們所做的一切都只是配置。我們還沒有透過網路發送任何東西。當我們呼叫.execute()
時,Jsoup 實際上會觸發 HTTP 請求。
Jsoup 使用給定的 URL 連線到目標伺服器。它會附加我們在建置請求時提供的所有標頭和有效負載。 Jsoup 會阻塞程序,直到伺服器回應,以確保我們收到回應後再繼續執行。伺服器回應後,Jsoup 會擷取狀態碼、回應主體和標頭。所有這些資訊都將儲存在Connection
物件中。
現在,我們可以呼叫response.body()
來取得回應的原始主體作為字串。然後,我們可以解析、記錄或將此字串轉換為物件。
4. 在 HttpBin 上發布數據
Httpbin是一個簡單且免費的 HTTP 請求和回應服務。讓我們使用上面討論的sendPost()
方法來向其發送一些資料:
public void givenJSONData_whenUsingHttpBin_thenPostContent() throws Exception {
Map<String, String> headersMap = new HashMap<>();
headersMap.put("Content-Type", "application/json");
String payload = "{ \"name\": \"Joe\", \"role\": \"Tester\" }";
String response = client.sendPost("https://httpbin.org/post", headersMap, payload);
assertNotNull(response);
assertTrue(response.contains("Joe"));
assertTrue(response.contains("Tester"));
}
在上述方法中,我們首先建立一個 HTTP 標頭映射。我們將Content-Type
設定為application/json,
這告訴伺服器我們正在發送 JSON 資料。接下來,我們建立一個 JSON 字串,表示要在請求正文中傳送的資料。然後,我們呼叫上面討論的sendPost()
方法來發送請求。
回應包含我們發送的 JSON 格式,因為 httpbin.org 會傳回我們發布的所有資料。接下來,我們可以執行斷言來確保一切按預期運行。
5. 結論
在本教程中,我們探討如何使用 Jsoup 發送 POST 請求。
我們探索如何將 Jsoup 用作輕量級 HTTP 用戶端(而非 HTML 解析器)。我們也了解了在處理傳回 JSON 資料的 API 時, ignoreContentType
的重要性。我們在httpbin
上的測試確認了 Jsoup 能夠發送請求並以原始字串的形式傳回伺服器回應。
對於複雜的用例,Jsoup 可能無法取代功能齊全的 HTTP 用戶端,但它可以很好地發送 JSON 有效負載並將輕量級 API 呼叫整合到我們的應用程式中。
與往常一樣,程式碼可在 GitHub 上取得。