1382 votes

Obtenir curl pour afficher le code de statut HTTP?

Je suis en train d'utiliser curl en ligne de commande sur Linux pour envoyer des requêtes HTTP. Les corps de réponse sont affichés sur la sortie standard, ce qui est bien, mais je ne vois pas sur le manuel comment obtenir curl pour afficher le code d'état HTTP de la réponse (404, 403, etc). Est-ce possible ?

0 votes

Pour ma part, je peux voir dans le manuel comment obtenir le code de statut HTTP, mais l'option -w ne fonctionne pas. J'ai signalé le bug à Apple.

71 votes

Le drapeau -i, comme dans curl -i https://www.example.com/, est probablement ce que vous voulez, selon superuser.com/a/514798/190188

0 votes

Pourquoi ne pas simplement quelque chose comme curl -IL http://www.example.com | grep "^HTTP\/" ?

7voto

Savitoj Singh Points 151

Utilisez la commande cURL suivante et redirigez-la vers grep comme suit :

$ curl -I -s -L http://example.com/v3/get_list | grep "HTTP/1.1"

Voici ce que fait chaque drapeau :

  • -I : Affiche uniquement les en-têtes de réponse
  • -s : Silencieux - Ne pas afficher la barre de progression
  • -L : Suivre les en-têtes Location:

Voici un lien vers les codes d'état HTTP.

Exécutez depuis la ligne de commande. Cette commande curl s'exécute en mode silencieux, suit les éventuelles redirections, récupère les en-têtes HTTP. grep affichera le code d'état HTTP sur la sortie standard.

7voto

Stuart Cardall Points 256

Un exemple de comment utiliser les codes de réponse. J'utilise cela pour re-télécharger les bases de données Geolite uniquement si elles ont changé (-z) et suivre les redirections (-L):

url=http://example.com/file.gz
file=$(basename $url)

response=$(curl -L -s -o $file -z $file $url -w "%{http_code}")

case "$response" in
        200) do_something ;;
        301) do_something ;;
        304) printf "Reçu : HTTP $response (fichier inchangé) ==> $url\n" ;;
        404) printf "Reçu : HTTP $response (fichier non trouvé) ==> $url\n" ;;
          *) printf "Reçu : HTTP $response ==> $url\n" ;;
esac

6voto

Pete Points 170

Voici une commande curl qui utilise GET et qui renvoie le code HTTP.

curl -so /dev/null -w '%{response_code}' http://www.example.org

N'oubliez pas que l'approche ci-dessous utilise HEAD, qui est plus rapide mais peut ne pas fonctionner correctement avec certains serveurs HTTP moins conformes.

curl -I http://www.example.org

0 votes

Ne fonctionne pas sur OS X au moins.

0 votes

Fonctionne bien pour moi sur OS X High Sierra 10.13.6.

6voto

srana Points 51
curl -so -i /dev/null -w "%{http_code}"  http://www.any_example.com

Cela renverra les informations suivantes :

  1. les données de réponse, si des données sont renvoyées par l'API comme une erreur
  2. le code d'état

0 votes

Cela ne suit pas les redirections. Cette réponse existante est meilleure superutilisateur.com/a/442395/475508

0 votes

Bien sûr, vous pouvez également vous y référer!!

5voto

Jaakko Points 290

Séparez la sortie du contenu vers stdout et le code de statut HTTP vers stderr :

curl http://www.example.org -o >(cat >&1) -w "%{http_code}\n" 1>&2

Si seul le code de statut HTTP est souhaité vers stderr, --silent peut être utilisé :

curl --silent http://www.example.org -o >(cat >&1) -w "%{http_code}\n" 1>&2

Le flux désiré peut alors être choisi en redirigeant celui non désiré vers /dev/null :

$ (curl --silent http://www.example.org -o >(cat >&1) -w "%{http_code}" 1>&2) 1>/dev/null
200
$ (curl --silent http://www.example.org -o >(cat >&1) -w "%{http_code}" 1>&2) 2>/dev/null

...

Note que pour que la deuxième redirection se comporte comme souhaité, nous devons exécuter la commande curl dans un sous-shell.

1 votes

Nécessite bash pour la substitution de processus.

0 votes

@Bruno, J'ai changé l'exemple de superuser.com/revisions/1444693/2, car je pense que les fichiers /tmp/out /tmp/err peuvent causer des résultats inattendus s'ils sont exécutés en parallèle.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X