1. 概述
本教程提供了一個簡要的概述,介紹了使用 curl 測試 REST API 的方法。
curl 是一種命令行工具,用於數據傳輸,並支持約 22 種協議,包括 HTTP。 這種組合使其成為測試我們 REST 服務的一個非常好的臨時工具。
2. 命令行選項
<em >curl</em> 支持超過 200 個命令行選項。我們可以使用零個或多個選項來搭配命令中的 URL。
在將其用於我們的用途之前,讓我們先查看兩個可以使我們的生活更輕鬆的選項。
2.1. 詳細模式 (Verbose)
當進行測試時,建議開啓詳細模式:
curl -v http://www.example.com/因此,這些命令提供有用的信息,例如已解析的 IP 地址、我們嘗試連接的端口以及 HTTP 標頭。
2.2. 輸出
默認情況下,curl 將響應體輸出到標準輸出。 此外,我們還可以通過提供輸出選項來保存到文件中:
curl -o out.json http://www.example.com/index.html這在響應大小較大的情況下尤其有用。
3. 使用 curl 的 HTTP 方法
每個 HTTP 請求都包含一個方法。 最常用的方法是 GET、POST、PUT 和 DELETE。
3.1. GET
這是一個默認方法,用於通過curl進行HTTP調用。事實上,之前展示的示例都是簡單的GET調用。
在本地運行服務實例(端口8082)時,我們使用類似以下的命令進行GET調用:
curl -v http://localhost:8082/spring-rest/foos/9由於我們啓用了詳細模式,因此我們還會收到響應體中一些額外的信息。
* Trying ::1...
* TCP_NODELAY set
* Connected to localhost (::1) port 8082 (#0)
> GET /spring-rest/foos/9 HTTP/1.1
> Host: localhost:8082
> User-Agent: curl/7.60.0
> Accept: */*
>
< HTTP/1.1 200
< X-Application-Context: application:8082
< Content-Type: application/json;charset=UTF-8
< Transfer-Encoding: chunked
< Date: Sun, 15 Jul 2018 11:55:26 GMT
<
{
"id" : 9,
"name" : "TuwJ"
}* Connection #0 to host localhost left intact3.2. POST
我們使用此方法向接收服務發送數據,這意味着我們使用 data 選項。
最簡單的方法是直接在命令中嵌入數據:
curl -d 'id=9&name=baeldung' http://localhost:8082/spring-rest/foos/new當然,以下是翻譯後的內容:
或者,我們可以通過將請求主體包含在文件中傳遞給 data 選項,例如如下所示:
curl -d @request.json -H "Content-Type: application/json"
http://localhost:8082/spring-rest/foos/new使用上述命令時,我們可能會遇到如下錯誤信息:
{
"timestamp" : "15-07-2018 05:57",
"status" : 415,
"error" : "Unsupported Media Type",
"exception" : "org.springframework.web.HttpMediaTypeNotSupportedException",
"message" : "Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported",
"path" : "/spring-rest/foos/new"
}這是因為 curl 會將以下默認標題添加到所有 POST 請求中:
Content-Type: application/x-www-form-urlencoded這同樣是瀏覽器在純 POST 請求中的使用方式。在我們的使用中,我們通常會根據需求自定義請求頭。
例如,如果我們的服務期望 JSON 內容類型,我們可以使用 -H 選項來修改原始的 POST 請求:
curl -d '{"id":9,"name":"baeldung"}' -H 'Content-Type: application/json'
http://localhost:8082/spring-rest/foos/newWindows 命令提示符不支持單引號,如 Unix 風格的 Shell。
因此,我們需要將單引號替換為雙引號,但我們會盡力在必要時進行轉義:
curl -d "{\"id\":9,\"name\":\"baeldung\"}" -H "Content-Type: application/json"
http://localhost:8082/spring-rest/foos/new此外,當我們需要發送較大的數據量時,通常使用數據文件也是一個不錯的選擇。
3.3. PUT
此方法與 POST 方法非常相似,但我們使用它時,是為了發送現有資源的最新版本。為了實現這一點,我們使用 -X 選項。
如果沒有指定請求方法類型,curl 默認使用 GET;因此,在 PUT 的情況下,我們明確指定了方法類型:
curl -d @request.json -H 'Content-Type: application/json'
-X PUT http://localhost:8082/spring-rest/foos/93.4. 刪除 (DELETE)
再次説明,我們使用 DELETE 操作,通過使用 -X 選項來實現:
curl -X DELETE http://localhost:8082/spring-rest/foos/94. 自定義標題
我們可以替換默認標題或添加自定義標題。
例如,要更改 Host 標題,我們這樣做:
curl -H "Host: com.baeldung" http://example.com/為了關閉 User-Agent 請求頭,我們將其設置為空值:
curl -H "User-Agent:" http://example.com/在測試過程中,最常見的做法是更改 Content-Type 和 Accept header。我們只需在每個 header 前添加 -H 選項:
curl -d @request.json -H "Content-Type: application/json"
-H "Accept: application/json" http://localhost:8082/spring-rest/foos/new5. 身份驗證
一個需要身份驗證的服務會返回一個 401 – Unauthorized HTTP 響應代碼,並附帶一個 WWW-Authenticate 標頭。
對於基本的身份驗證,我們可以只需在請求中嵌入用户名和密碼組合,使用 user 選項:
curl --user baeldung:secretPassword http://example.com/但是,如果我們想要使用 OAuth2 進行身份驗證,首先需要從我們的授權服務獲取 access_token。
服務響應將包含 access_token:
{
"access_token": "b1094abc0-54a4-3eab-7213-877142c33fh3",
"token_type": "bearer",
"refresh_token": "253begef-868c-5d48-92e8-448c2ec4bd91",
"expires_in": 31234
}現在我們可以將該令牌用於我們的 Authorization 標頭中:
curl -H "Authorization: Bearer b1094abc0-54a4-3eab-7213-877142c33fh3" http://example.com/6. 結論
在本文中,我們演示了使用 curl 命令的最小功能來測試我們的 REST 服務。雖然它能夠執行比此處討論的更多操作,但對於我們的目的而言,這已經足夠了。