Question Puis-je faire échouer cURL avec un code de sortie différent de 0 si le code de statut HTTP n'est pas 200?


Je supposais toujours que lorsque curl recevait une réponse HTTP 500, il renvoyait un code de sortie qui signifiait un échec (! = 0), mais cela semble être le cas. ne pas l'affaire.

Puis-je faire en sorte que cURL échoue avec un code de sortie différent de 0 si le code de statut HTTP n'est pas 200? Je sais que je peux utiliser -w "%{http_code}" mais cela le place dans STDOUT, pas comme le code de sortie (par ailleurs, je suis également intéressé par la capture de la sortie, que je ne veux pas rediriger vers un fichier, mais vers l'écran).


160
2018-05-01 12:37


origine




Réponses:


curl --fail fait partie de ce que vous voulez:

de man curl:

-f, --fail

(HTTP) Échec de manière silencieuse (pas de sortie du tout) sur les erreurs du serveur. Cela est principalement fait pour mieux activer les scripts, etc. afin de mieux gérer les tentatives infructueuses. Dans les cas normaux, lorsqu'un serveur HTTP ne parvient pas à délivrer un document, il renvoie un document HTML le indiquant (ce qui explique souvent pourquoi et plus encore). Cet indicateur empêchera curl de sortir cela et de retourner l'erreur 22.

Cette méthode n'est pas fiable et il arrive parfois que des codes de réponse non réussis soient transmis, en particulier lorsque l'authentification est impliquée (codes de réponse 401 et 407).

Mais il bloque la sortie à l'écran.


178
2017-10-10 18:36



Alors, quelles parties font-elles et ne font-elles pas? - rogerdpack
@rogerdpack tl; dr il ne retourne pas non nul lorsqu'il détecte une mauvaise réponse, mais ne laisse pas l'OP capturer la réponse - rampion
Cela n'intercepte pas HTTP 301 Move définitivement. curl donnait toujours le code de sortie 0. - wisbucky
@wisbucky 301 n'est pas une erreur, c'est un code d'état de redirection. Les erreurs sont des codes d'état 4xx et 5xx. - M. Justin


Si vous souhaitez simplement afficher le contenu de la page recourbée, vous pouvez le faire:

STATUSCODE=$(curl --silent --output /dev/stderr --write-out "%{http_code}" URL)

if test $STATUSCODE -ne 200; then
    # error handling
fi

Ceci écrit le contenu de la page dans STDERR tout en écrivant le code d'état HTTP dans STDOUT, afin qu'il puisse être affecté à la variable STATUSCODE.


61
2018-05-01 15:31



Que diriez-vous si je veux sortir la réponse en cas d'échec (non 200), mais retourne un non 0 code de statut du script? - Justin
@Justin: Qu'en est-il de if [ "$statuscode" -ne 200 ]; then exit "$statuscode"; fi ? - ghoti
@ghoti: seuls les codes de sortie de 8 bits non signés sont pris en charge, ce qui peut créer un peu de confusion. - Dennis
Ah, à droite - et les codes vont envelopper à 8 bits, donc l'erreur 404 devient la valeur de sortie 148, 500 devient 244. Confondre en effet! :-) - ghoti
En légère variation, cela capture le code dans une variable tout en redirigeant la réponse vers stdout, pas stderr: { code=$(curl ... as above ...); } 2>&1 Le tour est { ... } 2>&1 qui permet de rediriger, sans générer un shell différent ( ... ) aurait. - Tobia


J'ai pu le faire en utilisant une combinaison de drapeaux:

curl --silent --show-error --fail URL

--silencieux cache l'avancement et l'erreur
--show-error affiche le message d'erreur caché par --silent
--échouer renvoie un code de sortie> 0 lorsque la demande échoue


11
2017-09-12 14:48



Cela ne montre pas la réponse du serveur. Je ne suis pas OP mais je pense qu'il voulait voir un message d'erreur du serveur qui est retourné dans le corps. Outre un --silent --show-error --fail fonctionne comme juste -f/--fail. - waste
Réellement, --fail renvoie le code de sortie 22, comme documenté. - Quolonel Questions
Cela n'intercepte pas HTTP 301 Move définitivement. curl donnait toujours le code de sortie 0. - wisbucky
@wisbucky 301 n'est pas une erreur, c'est un code d'état de redirection. Les erreurs sont des codes d'état 4xx et 5xx. - M. Justin