Curl

最後更新: 2021-08-13 12:16:55 +0800 +0800
tags: Curl | Http | Networking
原文以英文撰寫。您正在閱讀AI翻譯版本。

curl 使用有序的命令列傳輸 URL:選項用於設定一個或多個傳輸,而每個 URL 都會啟動一次傳輸。它支援多種通訊協定;以下範例使用 HTTP,因為其要求與回應控制方式具有普遍性。

有意建構要求 #

使用 --request、--header 和 --data 明確宣告要求。除非指定其他方法,否則 --data 會選擇 POST。--data-binary @file 會保留檔案的位元組,而 --data @file 具有表單導向的行為。

sh
curl --fail-with-body --show-error --silent \
  --request POST \
  --header 'Content-Type: application/json' \
  --header "Authorization: Bearer $token" \
  --data-binary @request.json \
  --output response.json \
  https://api.example.invalid/v1/jobs

在可能的情況下,不要讓認證資訊出現在命令歷史中:使用受限的設定檔、認證資訊輔助程式,或由服務支援的身分驗證機制讀取的環境變數。在某些系統上,-u user:password 可能會使密碼暴露在程序清單中。

-L 會跟隨重新導向。當方法或認證資訊不得傳送到其他來源時,應限制其使用範圍;在自動化之前,使用 --verbose 檢查重新導向行為。

多次傳輸與 URL glob #

curl 區分全域選項與每次傳輸的選項。--verbose 等全域選項會在 --next 之後繼續生效;--header、--request 和 --output 等區域選項會在 --next 開始新操作時重設。不使用 --next 時,區域選項會套用至後續每個 URL,直到被修改,因此每個要求都必須明確指定有意使用的輸出與標頭集合。

sh
curl --output first.json https://example.invalid/one \
  --next --header 'Accept: text/plain' \
  --output second.txt https://example.invalid/two

為防止 shell 展開,請使用引號包圍 URL glob 語法。curl 會展開 [] 範圍和 {} 清單;--output 中的 #1、#2 以及後續佔位符會參照相符的 glob 元件。

sh
curl 'https://example.invalid/page[1-3].json' --output 'page-#1.json'

當字面上的方括號或大括號屬於 URL 時,使用 --globoff。

診斷傳輸路徑 #

使用 --verbose 取得要求、回應、代理伺服器和 TLS 協商的詳細資訊。使用 --write-out 記錄穩定的計時與狀態資料,而無需解析面向使用者的輸出。

sh
curl --silent --show-error --output /dev/null \
  --write-out 'http=%{response_code} dns=%{time_namelookup} connect=%{time_connect} total=%{time_total}\n' \
  https://example.invalid/

--resolve host:port:address 會在保留 URL 主機名稱與 TLS SNI 的同時測試指定位址。--connect-to 以更通用的方式重新導向連線。--proxy 選取代理伺服器,--noproxy 將主機排除在代理伺服器的使用範圍之外。不要使用 --insecure 修復憑證錯誤;應修正 URL、信任鏈、主機名稱或本機 CA 設定。

可重現地擷取結果 #

--fail-with-body 會在保留錯誤回應的同時,讓 HTTP 狀態錯誤以非零狀態結束。請檢查 curl 的結束狀態,因為 TCP 交換成功並不代表 HTTP 要求成功。僅對適合重複執行的傳輸使用 --retry:重試具冪等性的 GET 與重複執行付款用的 POST 並不相同。

擷取成品時,應分別寫入標頭和本文,固定完整 URL,並儲存計時中繼資料:

sh
curl --fail --show-error --location \
  --dump-header artifact.headers \
  --output artifact.tar.xz \
  --write-out '%{url_effective} %{response_code}\n' \
  https://downloads.example.invalid/tool-1.2.3.tar.xz
sha256sum artifact.tar.xz

驗證已發佈的校驗和或簽章;在不受信任的下載之後產生的校驗和只能記錄實際接收的位元組。

評論

在 GitHub 上閱讀或評論(發表評論需要登入)