【Shell】【Tool】call_api
call_api() {
curl -fsS \
--connect-timeout 2 \
--max-time 5 \
--retry 2 --retry-delay 1 \
-w " [HTTP_CODE=%{http_code}]\n" \
"$URL"
}
好的 👍 我來逐一說明 call_api() 這段裡面每個 curl 參數的作用,並且說明為什麼要加:
call_api() {
curl -fsS \
--connect-timeout 2 \
--max-time 5 \
--retry 2 --retry-delay 1 \
-w " [HTTP_CODE=%{http_code}]\n" \
"$URL"
}
參數逐一解析
-
-f/--fail-
作用:當 HTTP 狀態碼是 4xx / 5xx 時,不會把 HTML 錯誤頁輸出到 stdout,而是直接返回非零 exit code。
-
好處:可以在 script 判斷「這次呼叫失敗」,而不是誤以為拿到一大串錯誤 HTML 也算成功。
-
-
-s/--silent-
作用:靜默模式,不顯示下載進度條與錯誤訊息(錯誤還是會 exit code ≠ 0)。
-
好處:避免 cron job 或 log 裡塞滿進度百分比。
-
-
-S/--show-error-
作用:在
-s靜默模式下,仍然把錯誤訊息(例如 DNS 解析失敗、timeout)顯示出來。 -
好處:結合
-s使用,可以安靜但又不失錯誤訊息。
-
-
--connect-timeout 2-
作用:設定 TCP 連線的最大等待時間(單位:秒)。
-
例子:如果 API 服務根本沒在聽 port 8082,curl 會在 2 秒 內放棄。
-
-
--max-time 5-
作用:整個 request(連線、傳輸、讀取)的最長時間,超過就中斷。
-
好處:避免 API 掛住時,curl 一直卡在那裡。
-
-
--retry 2-
作用:遇到「暫時性錯誤」(像 DNS 解析失敗、timeout、connection reset by peer),會自動重試最多 2 次。
-
預設只會 retry network-level 的錯誤,不會 retry 4xx/5xx。
-
-
--retry-delay 1-
作用:每次 retry 前延遲 1 秒。
-
預設會 delay 1 秒,但這裡寫死確保一致。
-
-
-w " [HTTP_CODE=%{http_code}]\n"-
作用:在 response 輸出結尾,附加 HTTP 狀態碼。
-
例子:成功時會多一行
[HTTP_CODE=200] -
好處:log 裡可以直接看出 API 狀態。
-
-
"$URL"-
作用:實際要請求的 URL。
-
這裡設成變數,方便修改。
-
總結
這樣組合的意圖就是:
-
-fsS→ 安靜,但保留錯誤訊息,不要 HTML 錯誤頁 -
--connect-timeout/--max-time→ 控制時間上限,避免卡死 -
--retry/--retry-delay→ 短暫網路錯誤自動補救 -
-w %{http_code}→ log 裡清楚顯示 HTTP 狀態碼