Recuperar o código de status HTTP e o conteúdo do curl em um script de shell

Recuperar o código de status HTTP e o conteúdo do curl em um script de shell

Quero que um script se transforme em um arquivo e coloque o código de status em uma variável (ou, pelo menos, permita-me testar o código de status)

Posso ver que posso fazer isso em duas chamadas, por exemplo

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 ...

mas provavelmente há uma maneira de evitar a chamada extra redundante?

$?não ajuda: o código de status 404 ainda recebe um código de retorno 0

Responder1

#!/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"

(Existem outras formas como --write-outum arquivo temporário. Mas meu exemplo não precisa tocar no disco para gravar qualquer arquivo temporário e lembrar de excluí-lo; tudo é feito na RAM)

Responder2

Usar --write-out e um arquivo temporário me levou a:

  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

Responder3

Desde o curl 7.76.0, existe uma opção para fazer isso sem a chamada extra,--queda-com-corpo

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

Curl falhará com o código 22 se a solicitação retornar qualquer código de status HTTP acima de 400, mas retornará o corpo independentemente do código de status.

informação relacionada