Rufen Sie sowohl den HTTP-Statuscode als auch den Inhalt von curl in einem Shell-Skript ab

Rufen Sie sowohl den HTTP-Statuscode als auch den Inhalt von curl in einem Shell-Skript ab

Ich möchte ein Skript, das eine Datei erstellt und den Statuscode in eine Variable einfügt (oder mir zumindest ermöglicht, den Statuscode zu testen).

Ich sehe, dass ich es in zwei Anrufen erledigen kann, z. B.

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

aber vermutlich gibt es eine Möglichkeit, den redundanten zusätzlichen Anruf zu vermeiden?

$?hilft nicht: Statuscode 404 bringt immer noch einen Returncode von 0

Antwort1

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

(Es gibt auch andere Möglichkeiten, z. B. --write-outeine temporäre Datei. In meinem Beispiel muss ich jedoch nicht auf die Festplatte zugreifen, um eine temporäre Datei zu schreiben und daran denken, sie zu löschen; alles wird im RAM erledigt.)

Antwort2

Durch die Verwendung von --write-out und einer temporären Datei gelange ich zu:

  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

Antwort3

Seit curl 7.76.0 gibt es eine Option, dies ohne den zusätzlichen Aufruf zu tun,--mit-Körper-fallen

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

Curl schlägt mit Code 22 fehl, wenn die Anforderung einen HTTP-Statuscode über 400 zurückgibt, gibt den Text jedoch unabhängig vom Statuscode zurück.

verwandte Informationen