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

57voto

Grzegorz Luczywo Points 539

Redéfinir la sortie de curl:

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

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

0 votes

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

0 votes

Il s'agit de la réponse la plus directe - pas de solutions alternatives étranges avec des descripteurs de fichiers, un traitement bricolé de texte lisible par l'homme avec sed, une sortie de texte supplémentaire non désirée...

52voto

mahatmanich Points 505

Code de statut UNIQUEMENT

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

Tout le crédit pour ce GIST

2 votes

Cette astuce fonctionne parfaitement, surtout lors de l'utilisation de curl entre les conteneurs Docker. Je l'utilise comme ceci en PHP : exec("curl -LI "mon nom de service"/"le fichier pour lequel je recherche le code HTTP" -o /dev/null -w '%{http_code}\n' -s") (par exemple : exec("curl -LI static/someimage.jpg -o [...] où "static" est le nom du service défini dans Docker Compose). Merci !

0 votes

Je supprimerais le -I afin qu'il fasse une requête GET normale au lieu d'une requête HEAD.

21voto

Lucas Cimon Points 442

C'est une limitation douloureuse de curl --fail. De man curl :

-f, --fail (HTTP) Échoue silencieusement (aucune sortie) en cas d'erreurs du serveur

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

Basé sur la réponse de pvandenberk et cette autre astuce très utile apprise sur SO, voici un 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 de retour non utilisé par curl) en cas de code HTTP dans la plage [400, 600[.

3 votes

D'accord, ne pas pouvoir voir la sortie d'erreur est une limitation douloureuse du très pratique --fail. Comment diagnostiquer un échec de l'API REST sans voir la sortie d'erreur ? Il est si malheureux que le mainteneur de curl bagder insiste obstinément à ne pas fournir un --fail-but-show-error. github.com/curl/curl/issues/1978

0 votes

Comme indiqué dans la documentation, cela ne fonctionne pas pour les codes HTTP 401 et 407 :(

2 votes

Grâce à un collègue, j'ai découvert --fail --show-error

17voto

Filip Spiridonov Points 231

Cela enverra une demande à l'URL, ne récupérera que la première ligne de la réponse, la divisera en blocs et sélectionnera la deuxième.

Il contient le code de réponse

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

1 votes

Pouvez-vous expliquer ce que ce code fait et comment il résout le problème donné par l'OP ? Un code non expliqué peut sembler peu fiable et dangereux pour les utilisateurs.

2 votes

Bien sûr, nous envoyons une requête à l'URL, récupérons uniquement la première ligne de la réponse, la divisons en blocs et sélectionnons la deuxième. Elle contient le code de réponse que l'OP recherche.

15voto

zafar142003 Points 231

Pour une requête POST, ce qui suit a 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]'

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