Recupere tanto el código de estado HTTP como el contenido de curl en un script de shell

Recupere tanto el código de estado HTTP como el contenido de curl en un script de shell

Quiero que un script se convierta en un archivo y coloque el código de estado en una variable (o al menos me permita probar el código de estado)

Puedo ver que puedo hacerlo en dos llamadas con, por ejemplo

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

¿Pero presumiblemente hay una manera de evitar la llamada adicional redundante?

$?no ayuda: el código de estado 404 todavía recibe un código de retorno de 0

Respuesta1

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

(Hay otras formas, como --write-outcon un archivo temporal. Pero en mi ejemplo no es necesario tocar el disco para escribir ningún archivo temporal y recordar eliminarlo; todo se hace en la RAM)

Respuesta2

Usar --write-out y un archivo temporal me llevó 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

Respuesta3

Desde curl 7.76.0 existe una opción para hacer esto sin la llamada adicional,--caída-con-cuerpo

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

Curl fallará con el código 22 si la solicitud devuelve cualquier código de estado HTTP superior a 400, pero devolverá el cuerpo independientemente del código de estado.

información relacionada