Question Obtenir curl pour sortir le code d'état HTTP?


j'utilise curl sur la ligne de commande sous Linux pour émettre des requêtes HTTP. Les corps de réponse sont imprimés en sortie standard, ce qui est bien, mais je ne vois pas sur la page de manuel comment obtenir curl pour imprimer le code d'état HTTP de la réponse (404, 403, etc.). Est-ce possible?


559
2018-04-18 10:28


origine


En ce qui me concerne, je peux voir dans le manuel comment obtenir le code d’état HTTP, mais l’option -w ne fonctionne pas. J'ai signalé le bug à Apple. - Nicolas Barbulesco
le -i drapeau, comme dans curl -i https://www.example.com/, est probablement ce que vous voulez, selon superuser.com/a/514798/190188 - caw


Réponses:


Cela devrait fonctionner pour vous si le serveur Web est capable de répondre aux requêtes HEAD (cela ne GET):

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

De plus, pour laisser cURL suivre les redirections (statuts 3xx), ajoutez -L.


350
2018-04-18 10:56



NB: curl -I effectue une requête HTTP HEAD, ce qui peut être problématique pour tester le code d'état HTTP de certains serveurs d'applications Web et services - Jay Taylor
Et pour obtenir uniquement le numéro de statut, dirigez-le vers head -n 1|cut -d$' ' -f2 - Benubird
N'oubliez pas de rediriger les boucles stderr: 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. - Aaron Blenkush
Suivre la redirection après avoir uniquement effectué une requête HEAD peut entraîner un comportement intéressant, en fonction de la programmation de l'application. - Scott McIntyre
curl -I -X GET enverra une requête GET, mais donnera la même sortie. - jiggy


Une manière plus spécifique d'imprimer juste le code de statut HTTP est quelque chose comme:

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

Il est beaucoup plus facile de travailler avec des scripts, car il ne nécessite aucune analyse :-)

Le paramètre -I peut être ajouté pour améliorer les performances de la charge de réponse. Ce paramètre demande simplement l'état / les en-têtes de réponse, sans corps de réponse de téléchargement. (% {http_code} renvoie la première ligne de la charge HTTP)

c'est à dire.:

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

625
2018-06-28 00:25



-w "% {http_code}" est le bit qui imprime le code d'état. Vous pouvez ajouter une ou deux nouvelles lignes pour séparer le code du corps (-w "\ n \ n% {http_code} \ n") - Jeffrey Martinez
Wow, ça /dev/null La chose fonctionne même dans la version Windows de curl que j'utilise. - Uwe Keim
Je crois que cela télécharge l'intégralité du fichier même si tout va à / dev / null, donc pas idéal pour vérifier le code d'état des fichiers volumineux. httping -c 1 -s -G -m émet un GET et ne télécharge pas tout le fichier, bien que je réalise que cette question concerne spécifiquement curl. - RomanSt
@romkyns, vous avez raison: la première variante de ma réponse télécharge le fichier entier et le "sauvegarde" /dev/null, mais la deuxième variante - c.-à-d. celui qui utilise le -I option pour curl - n'est pas Cependant, il faut faire attention, car vous ne testez pas vraiment la même action: on fait un HTTP GET demande, tandis que l’autre fait HEAD request ... certains webservers / sites Web répondront avec un code de statut différent, même si l'URL demandée est exactement la même! - pvandenberk
FYI: -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 à stdout après la sortie. - Ajedi32


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

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

171
2018-05-03 04:28



+1 pour signaler le drapeau verbeux fournit les détails supplémentaires. Idéal pour tester les applications REST. - MrOodles
+1 très facile à utiliser lors d'une requête POST (curl -v --data "...") - MegaTux
Il les divise même en deux sorties de fichier différentes (détails de statut http vers stderr et corps de réponse vers stdout) - Blauhirn


Vous pouvez imprimer le code d'état, en plus de tous les en-têtes, en procédant comme suit:

curl -i http://example.org

La bonne chose à propos de -i est que ça marche avec -X POST ainsi que.


142
2017-12-04 20:45



Beaucoup mieux que la réponse acceptée (qui fait une demande HEAD). - neu242
Peut-être évident, mais -i travaille avec tout Méthode HTTP, pas seulement GET et POST... :) - mac
la meilleure réponse car elle rend curl sortie à la fois les en-têtes et le corps, ce qui le rend approprié pour la plupart des tâches lorsqu'il est utilisé dans un script - Sarge Borsch
Ceci est la meilleure réponse, et peut être utilisé en conjonction avec -s (ne pas montrer compteur de progrès ou des messages d'erreur) et -S(montrent des messages d'erreur après tout) - Jonathan Hartley


Si vous souhaitez capturer le code d'état HTTP dans une variable, mais redirigez toujours 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 avec exec 3>&1.

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

Mettre tous ensemble:

#creates a new file descriptor 3 that redirects to 1 (STDOUT)
exec 3>&1 
# Run curl in a separate command, capturing output of -w "%{http_code}" into HTTP_STATUS
# and sending the content to this command's STDOUT with -o >(cat >&3)
HTTP_STATUS=$(curl -w "%{http_code}" -o >(cat >&3) 'http://example.com')

45
2018-01-08 20:59



C'est sérieux, et j'aime ça! - spyle
Maintenant, comment puis-je, à mon tour, rediriger la sortie vers une autre variable? - Roger Filmyer
La sortie est en 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. - Heath Borders


Redéfinir la sortie en boucle:

curl -sw '%{http_code}' http://example.org

Peut être utilisé avec n'importe quel type de demande.


26
2017-08-05 18:18



-k (--insecure) remplace -s (silencieux). - Ravichandra


Cela enverra une requête à url, n'obtiendra que la première ligne de la réponse, la divisera en blocs et sélectionnera la seconde.

Il contient le code de réponse

curl -I http://example.org 2>/dev/null | head -n 1 | cut -d$' ' -f2

10
2017-07-15 20:08



Pouvez-vous expliquer ce que fait ce code et comment il résout le problème posé par l'OP? Un code inexpliqué peut sembler non fiable et dangereux pour les utilisateurs. - bwDraco
Bien sûr, nous envoyons une requête à url, n'obtenons que la première ligne de la réponse, la divisons en blocs et sélectionnons la seconde. Il contient le code de réponse recherché par OP. - Filip Spiridonov


Pour une demande POST, les éléments suivants ont fonctionné:

curl -w 'RESP_CODE:%{response_code}' -s -X POST --data '{"asda":"asd"}' http://example.com --header "Content-Type:application/json"|grep -o  'RESP_CODE:[1-4][0-9][0-9]'

8
2018-01-07 08:36





Code de statut SEULEMENT

[0]$ curl -LI http://www.example.org -o /dev/null -w '%{http_code}\n' -s
[0]$ 200

Tout le crédit à cela ESSENTIEL


8
2018-02-08 10:44





Ceci est douloureux curl --fail limitation. De man curl :

-f, --fail       (HTTP) Échec en silence (pas de sortie du tout) sur les erreurs du serveur

Mais il n'y a aucun moyen d'obtenir à la fois le code retour non nul ET le corps de réponse dans stdout.

Basé sur pvandenberkla réponse et cet autre truc très utile appris sur SO, voici une solution de contournement:

curl_with_error_code () {
    _curl_with_error_code "$@" | sed '$d'
}
_curl_with_error_code () {
    local curl_error_code http_code
    exec 17>&1
    http_code=$(curl --write-out '\n%{http_code}\n' "$@" | tee /dev/fd/17 | tail -n 1)
    curl_error_code=$?
    exec 17>&-
    if [ $curl_error_code -ne 0 ]; then
        return $curl_error_code
    fi
    if [ $http_code -ge 400 ] && [ $http_code -lt 600 ]; then
        echo "HTTP $http_code" >&2
        return 127
    fi
}

Cette fonction se comporte exactement comme curl, mais renverra 127 (un code retour non utilisé par curl) dans le cas d’un code HTTP compris dans l’intervalle [400, 600 [.


7
2018-04-06 13:08



Convenu, ne pas être en mesure de voir la sortie d'erreur est une limitation douloureuse de la - autrement dit très pratique - échec. Comment pouvez-vous diagnostiquer une défaillance d'api REST sans voir la sortie d'erreur? Il est tellement malheureux que le bagder du mainteneur de la boucle insiste obstinément pour ne pas fournir une erreur --fail-but-show-error. github.com/curl/curl/issues/1978 - jamshid