J'utilise curl
la ligne de commande sous Linux pour émettre des requêtes HTTP. Les corps des réponses sont imprimés au format standard, ce qui est correct, mais je ne vois pas dans la page de manuel comment curl imprimer le code d’état HTTP à partir de la réponse (404, 403, etc.). Est-ce possible?
800
-i
drapeau, comme danscurl -i https://www.example.com/
, est probablement ce que vous voulez, selon superuser.com/a/514798/190188curl -IL http://www.example.com | grep "^HTTP\/"
?Réponses:
Cela devrait fonctionner pour vous si le serveur Web est en mesure de répondre aux requêtes HEAD (cela n'effectuera pas
GET
):En outre, pour laisser cURL suivre les redirections (statuts 3xx), ajoutez -L.
la source
curl -I
fait une requête HTTP HEAD, ce qui peut être problématique pour tester le code de statut HTTP pour certains serveurs d'applications Web et serviceshead -n 1|cut -d$' ' -f2
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.curl -I -X GET
enverra une demande GET, mais donnera le même résultat.Un moyen plus spécifique d’imprimer uniquement le code de statut HTTP est le suivant:
Beaucoup plus facile à utiliser dans les scripts, car il ne nécessite aucune analyse syntaxique :-)
Le paramètre
-I
peut être ajouté pour améliorer les performances de charge de réponse. Ce paramètre demande simplement un statut / en-tête de réponse, sans corps de réponse de téléchargement.Remarque:
%{http_code}
renvoie sur la première ligne de la charge HTTPc'est à dire:
la source
/dev/null
chose fonctionne même dans la version Windows de curl que j'utilise.httping -c 1 -s -G -m
émet un GET et ne télécharge pas le fichier en entier, bien que je réalise que cette question concerne spécifiquement curl.-s
= Ne pas afficher la progression du téléchargement,-o /dev/null
= Ne pas afficher le corps,-w "%{http_code}"
= Ecrire le code de réponse http sur la sortie standard après la sortie.Si vous voulez voir l'en-tête ainsi que le résultat, vous pouvez utiliser l'option verbeuse:
Le statut apparaîtra dans l'en-tête. Par exemple
la source
Vous pouvez imprimer le code d'état, en plus de tous les en-têtes, en procédant comme suit:
La bonne chose
-i
est que cela fonctionne-X POST
aussi bien.la source
-i
fonctionne avec n'importe quelle méthode HTTP, pas seulementGET
etPOST
... :)-s
(ne pas afficher l'indicateur de progression ou les messages d'erreur) et-S
(afficher les messages d'erreur après tout)Si vous souhaitez capturer le code de statut HTTP dans une variable, mais que vous redirigez le contenu vers STDOUT, vous devez créer deux STDOUT. Vous pouvez le faire avec substitution de processus> () et substitution de commande $ () .
Tout d’abord, créez un descripteur de fichier
3
pour votre processus actuel 'STDOUT avecexec 3>&1
.Ensuite, utilisez l'
-o
option de curl pour rediriger le contenu de la réponse vers un fifo temporaire à l'aide de la substitution de commande, puis, dans cette substitution, redirigez la sortie vers le descripteur de fichier STDOUT de votre processus actuel3
avec-o >(cat >&3)
.Mettre tout cela ensemble
bash
3.2.57(1)-release
(en standardmacOS
):Notez que cela ne fonctionne pas
/bin/sh
comme SamK l’a noté dans les commentaires ci-dessous .la source
STDOUT
, vous devriez donc pouvoir rediriger la sortie de la commande vers n'importe où, comme une commande normale. Je n'ai pas testé cela cependant.Redéfinir la sortie curl:
Peut être utilisé avec n'importe quel type de demande.
la source
Code d'état SEULEMENT
Tout crédit à ce GIST
la source
C'est une
curl --fail
limitation douloureuse . Deman curl
:Mais il n'y a aucun moyen d'obtenir à la fois le code retour non nul ET le corps de la réponse dans stdout.
Basé sur la réponse de pvandenberk et sur cette autre astuce très utile apprise sur SO , voici une solution de contournement:
Cette fonction se comporte exactement comme
curl
, mais renverra 127 (un code de retour non utilisé parcurl
) dans le cas d'un code HTTP de la plage [400, 600 [.la source
Cela enverra une requête à l'URL, obtiendra seulement la première ligne de la réponse, la divisera en blocs et sélectionnera la seconde.
Il contient le code de réponse
la source
Pour une demande POST, les éléments suivants ont fonctionné:
la source
Utilisez la commande cURL suivante et dirigez-la vers grep comme ceci:
Voici ce que fait chaque drapeau:
-I
: Afficher uniquement les en-têtes de réponse-s
: Silencieux - Ne pas afficher la barre de progression-L
: Suivre les en-Location:
têtesVoici un lien vers les codes de statut HTTP .
Exécuter à partir de la ligne de commande. Cette boucle s'exécute en mode silencieux, suit les redirections, récupère les en-têtes HTTP. grep imprimera le code de statut HTTP sur la sortie standard.
la source
Cela retournera les informations suivantes:
la source
Voici une commande curl qui utilise
GET
et qui retourne le code HTTP.N'oubliez pas que l'approche ci-dessous utilise
HEAD
, ce qui est plus rapide mais peut ne pas fonctionner correctement avec certains serveurs HTTP moins compatibles Web.la source
Un exemple d'utilisation des codes de réponse. J'utilise ceci pour télécharger à nouveau les bases de données Geolite uniquement si elles ont été modifiées (
-z
) et après les redirections (-L
):la source
Le PO veut connaître le code de statut. Souvent, lorsque vous téléchargez un fichier, vous souhaitez également avoir une idée de sa taille. J'utilise donc d'abord curl pour afficher le code d'état et la taille du fichier, puis éteindre le fichier détaillé et le diriger vers l'emplacement et le nom que je souhaite:
Puis j'attends la finition de la boucle
avant que je lance la commande suivante. Ce qui précède, lorsqu'il est utilisé dans un script de nombreuses commandes comme ci-dessus, donne une réponse intéressante comme:
Veuillez noter que -o in curl doit être suivi du chemin d'accès complet du fichier + du nom du fichier. Cela vous permet ainsi de sauvegarder des fichiers dans une structure de noms raisonnable lorsque vous les l / l avec curl. Notez également que -s et -S utilisés ensemble font taire la sortie, mais affichent des erreurs. Notez également que -R essaie de définir l’horodatage du fichier sur celui du fichier Web.
Ma réponse est basée sur ce que @pvandenberk avait initialement suggéré, mais en plus, elle enregistre le fichier quelque part, au lieu de simplement diriger vers / dev / null.
la source
Diviser le contenu de sortie en un
stdout
code de statut HTTP enstderr
:Si seul le code de statut HTTP est souhaité pour stderr,
--silent
peut être utilisé:Le flux souhaité peut ensuite être sélectionné en redirigeant le flux indésirable vers
/dev/null
:Notez que pour que la deuxième redirection se comporte comme vous le souhaitez, nous devons exécuter la commande curl dans le sous-shell.
la source
bash
une substitution de processus./tmp/out
/tmp/err
fichiers peuvent provoquer des résultats inattendus s'ils sont exécutés en parallèle.