J'utilise curl pour obtenir les en-têtes http pour trouver le code d'état http et aussi pour renvoyer la réponse. J'obtiens les en-têtes http avec la commande
curl -I http://localhost
Pour obtenir la réponse, j'utilise la commande
curl http://localhost
Dès que j'utilise le drapeau -I, je n'obtiens que les en-têtes et la réponse n'est plus là. Existe-t-il un moyen d'obtenir la réponse http et le code d'état des en-têtes / http en une seule commande?
Réponses:
J'ai pu obtenir une solution en regardant la doc curl qui spécifie à utiliser
-
pour la sortie pour obtenir la sortie vers stdout.Pour obtenir la réponse avec juste le code de retour http, je pourrais simplement faire
la source
-i
. Ou peut-v
- être si vous aimez aussi des informations supplémentaires.-o -I
finit par créer un fichier nommé littéralement «-I
» dans le CWD. Quelqu'un d'autre voit-il cela? La solution pour cela est-o/dev/null -I
le mode verbeux vous dira tout
la source
J'utilise cette commande pour imprimer le code d'état sans aucune autre sortie. De plus, il n'effectuera qu'une requête HEAD et suivra la redirection (respectivement
-I
et-L
).Cela facilite la vérification du code d'état dans un script de santé:
la source
curl -o -I -L -s -w "%{http_code}" http://localhost
un fichier est créé appelé-I
, pour contourner ce-o
/dev/null
curl -o /dev/null -I -L -s -w "%{http_code}" http://localhost
J'ai trouvé cette question parce que je voulais à la fois la réponse et le contenu afin d'ajouter une gestion des erreurs pour l'utilisateur.
Vous pouvez imprimer le code d'état HTTP sur std out et écrire le contenu dans un autre fichier.
Cela vous permet d'utiliser la logique pour décider si la réponse mérite d'être traitée.
la source
L'
-i
option est celle que vous souhaitez:Vous pouvez également utiliser l'option verbose:
la source
J'ai utilisé ceci:
Pour obtenir l'état HTTP
Pour obtenir le corps de réponse, j'ai utilisé ceci
la source
Cette commande
obtiendra le corps et le statut séparés par des virgules; vous pouvez les séparer pour les sortir.
Vous pouvez modifier le délimiteur à votre guise.
la source
Pour une utilisation programmatique, j'utilise ce qui suit:
Il montre la sortie suivante:
la source
C'est une façon de récupérer le corps "ET" le code d'état et de le formater dans un json approprié ou tout autre format qui fonctionne pour vous. Certains peuvent argumenter que c'est l'utilisation incorrecte de l'option de format d'écriture, mais cela fonctionne pour moi lorsque j'ai besoin à la fois du corps et du code d'état dans mes scripts pour vérifier le code d'état et relayer les réponses du serveur.
exécutez le code ci-dessus et vous devriez récupérer un json dans ce format:
avec l'option -w write format, puisque stderr est imprimé en premier, vous pouvez formater votre sortie avec le var http_code et placer le corps de la réponse dans une valeur (corps) et suivre la clôture en utilisant var stdout. Ensuite, redirigez votre sortie stderr vers stdout et vous pourrez combiner à la fois http_code et le corps de la réponse en une sortie soignée
la source
curl: unknown --write-out variable: 'stderr'
etcurl: unknown --write-out variable: 'stdout'
Ma façon d'y parvenir :
Pour obtenir les deux (en-tête et corps), j'effectue généralement un
curl -D- <url>
comme dans:Cela videra les en-têtes (
-D
) dans stdout (-
) (Cherchez--dump-header
dans man curl ).IMHO également très pratique dans ce contexte:
J'utilise souvent jq pour mettre en forme ces données json (par exemple à partir de certaines API restantes). Mais comme jq ne s'attend pas à un en-tête HTTP, l'astuce consiste à imprimer les en-têtes vers stderr en utilisant
-D/dev/stderr
. Notez que cette fois, nous utilisons également-sS
(--silent, --show-errors) pour supprimer la barre de progression (car nous écrivons dans un tube).Je suppose que cela peut également être pratique si vous souhaitez imprimer des en-têtes (pour une inspection rapide) sur la console mais rediriger le corps vers un fichier (par exemple, lorsque c'est une sorte de binaire pour ne pas gâcher votre terminal):
Attention: ce n'est PAS la même chose que
curl -I <url>
! Comme-I
effectuera uneHEAD
requête et non uneGET
requête (Cherchez--head
dans man curl . Oui: Pour la plupart des serveurs HTTP, cela donnera le même résultat. Mais je connais beaucoup d'applications métier qui n'implémentent pas du tout laHEAD
requête ;-Pla source
la source