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\/" ?

1401voto

dam Points 9

Un moyen plus spécifique d'imprimer seulement le code de statut HTTP est quelque chose comme suit :

curl -s -o /dev/null -w "%{http_code}" http://www.example.org/

Beaucoup plus facile à utiliser dans les scripts, car cela ne nécessite aucun parsing :-)

Le paramètre -I peut être ajouté pour améliorer les performances de chargement de la réponse. Cela modifiera l'appel en un appel HEAD qui ne récupérera que les en-têtes de réponse, sans le corps.

Note : %{http_code} retourne sur la première ligne de la charge utile HTTP (variables disponibles pour l'option -w sur la page de documentation de curl)

c.-à-d. :

curl -s -o /dev/null -I -w "%{http_code}" http://www.example.org/

81 votes

-w "%{http_code}" est le bout de code qui affiche le code de statut. Vous pouvez ajouter une ou deux nouvelles lignes là-dedans pour séparer le code du corps (-w "\n\n%{http_code}\n")

17 votes

Wow, this /dev/null fonctionne même dans la version Windows de curl que j'utilise.

3 votes

Je crois que cela télécharge l'intégralité du fichier même si tout va dans /dev/null, donc pas idéal pour vérifier le code d'état des fichiers volumineux. httping -c 1 -s -G -m envoie une requête GET et ne télécharge pas l'intégralité du fichier, même si je réalise que cette question concerne spécifiquement curl.

903voto

Graham Clark Points 9038

Cela devrait fonctionner pour vous si le serveur web est capable de répondre aux demandes HEAD (cela ne réalisera pas une demande GET) :

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

En outre, pour permettre à cURL de suivre les redirections (statuts 3xx), ajoutez -L.

221 votes

NB: curl -I effectue une requête HTTP HEAD, ce qui peut poser problème pour tester le code de statut HTTP de certains serveurs et services d'application Web

31 votes

Et pour obtenir uniquement le numéro d'état, le rediriger vers head -n 1|cut -d$' ' -f2

51 votes

N'oubliez pas de rediriger stderr de curl: curl -I http://www.example.org 2>/dev/null | head -n 1 | cut -d$' ' -f2. Ajoutez -L à curl si vous avez besoin du statut final après les redirections.

477voto

Marie Talcod Points 1

Vous pouvez imprimer le code d'état, en plus de tous les en-têtes en effectuant ce qui suit :

curl -i http://example.org

La bonne chose à propos de -i est qu'il fonctionne également avec -X POST.

80 votes

Beaucoup mieux que la réponse acceptée (qui effectue une requête HEAD).

18 votes

Peut-être évident, mais -i fonctionne avec n'importe quelle méthode HTTP, pas seulement GET et POST... :)

7 votes

La meilleure réponse car elle affiche à la fois les en-têtes et le corps de la requête, la rendant adaptée à la plupart des tâches lorsqu'elle est utilisée dans un script

286voto

Enrico Susatyo Points 3276

Si vous voulez voir l'en-tête ainsi que le résultat, vous pouvez utiliser l'option verbose :

curl -v http://www.example.org
curl --verbose http://www.example.org

Le statut apparaîtra dans l'en-tête. Par exemple.

< Date: Tue, 04 Nov 2014 19:12:59 GMT
< Content-Type: application/json; charset=utf-8
< Status: 422 Unprocessable Entity

36 votes

+1 pour avoir souligné que le drapeau verbose fournit des détails supplémentaires. Idéal pour tester les applications REST.

8 votes

+1 très facile à utiliser lors de l'envoi de requêtes POST (curl -v --data "...")

2 votes

Cela les divise même en deux sorties de fichiers différentes (détails du statut http vers stderr et corps de la réponse vers stdout)

94voto

mat Points 5365

Si vous voulez capturer le code d'état HTTP dans une variable, mais rediriger toujours le contenu vers STDOUT, vous devez créer deux STDOUT. Vous pouvez le faire avec la substitution de processus >() et la substitution de commande $().

Tout d'abord, créez un descripteur de fichier 3 pour le STDOUT de votre processus actuel avec exec 3>&1.

Ensuite, utilisez l'option -o de curl pour rediriger le contenu de la réponse vers un fifo temporaire en utilisant la substitution de commande, puis dans cette substitution de commande, redirigez la sortie vers le descripteur de fichier STDOUT de votre processus actuel 3 avec -o >(cat >&3).

En mettant tout cela ensemble dans bash 3.2.57(1)-release (standard pour macOS) :

# crée un nouveau descripteur de fichier 3 qui redirige vers 1 (STDOUT)
exec 3>&1 
# Exécute curl dans une commande séparée, capturant la sortie de -w "%{http_code}" dans HTTP_STATUS
# et envoyant le contenu à STDOUT de cette commande avec -o >(cat >&3)
HTTP_STATUS=$(curl -w "%{http_code}" -o >(cat >&3) 'http://example.com')

Notez que cela ne fonctionne pas dans /bin/sh comme SamK l'a noté dans les commentaires ci-dessous.

7 votes

C'est sérieusement chic...et j'aime ça !

4 votes

Maintenant, comment puis-je rediriger la sortie vers une autre variable?

1 votes

La sortie se trouve dans STDOUT, vous devriez donc pouvoir rediriger la sortie de la commande n'importe où vous le souhaitez, tout comme une commande normale. Je n'ai pas testé cela cependant.

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