在 shell 腳本中從 curl 檢索 HTTP 狀態碼和內容

在 shell 腳本中從 curl 檢索 HTTP 狀態碼和內容

我想要一個腳本捲曲到一個文件並將狀態代碼放入變數中(或至少使我能夠測試狀態代碼)

我可以看到我可以透過兩次電話來完成,例如

url=https://www.gitignore.io/api/nonexistentlanguage
x=$(curl -sI $url | grep HTTP | grep -oe '\d\d\d')
if [[ $x != 200  ]] ; then
  echo "$url SAID $x" ; return
fi
curl $url # etc ...

但大概有一種方法可以避免多餘的額外呼叫?

$?沒有幫助:狀態代碼 404 仍然得到回傳代碼 0

答案1

#!/bin/bash

URL="https://www.gitignore.io/api/nonexistentlanguage"

response=$(curl -s -w "%{http_code}" $URL)

http_code=$(tail -n1 <<< "$response")  # get the last line
content=$(sed '$ d' <<< "$response")   # get all but the last line which contains the status code

echo "$http_code"
echo "$content"

(還有其他方法,例如--write-out臨時檔案。但我的範例不需要觸摸磁碟來寫入任何臨時檔案並記住刪除它;一切都在 RAM 中完成)

答案2

使用 --write-out 和臨時檔案讓我:

  url="https://www.gitignore.io/api/$1"
  tempfile=$(mktemp)

  code=$(curl -s $url --write-out '%{http_code}' -o $tempfile)

  if [[ $code != 200  ]] ; then
    echo "$url SAID $code"
    rm -f $tempfile
    return $code
  fi
  mv $tempfile $target

答案3

從curl 7.76.0開始,有一個選項可以在不需要額外呼叫的情況下執行此操作,--與身體一起墜落

curl -sI --fail-with-body $url

如果請求傳回任何高於 400 的 HTTP 狀態代碼,Curl 將失敗並傳回代碼 22,但無論狀態代碼為何,都會傳回正文。

相關內容