Извлечение кода статуса HTTP и содержимого из curl в скрипте оболочки

Извлечение кода статуса HTTP и содержимого из curl в скрипте оболочки

Мне нужен скрипт для сохранения в файл и помещения кода состояния в переменную (или, по крайней мере, позволяющий мне проверить код состояния)

Я вижу, что могу сделать это в два вызова, например,

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во временный файл. Но в моем примере не нужно прикасаться к диску, чтобы записать какой-либо временный файл и помнить о его удалении; все делается в оперативной памяти)

решение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

Curl завершится ошибкой с кодом 22, если запрос вернет любой код статуса HTTP выше 400, но вернет тело запроса независимо от кода статуса.

Связанный контент