J'utilise curl pour obtenir des en-têtes http afin de trouver le code de statut http et de renvoyer une réponse. Je reçois 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 fois la réponse http et les en-têtes/le code d'état http en une seule commande?
J'ai pu trouver une solution en consultant le doc curl qui spécifie l'utilisation - pour que la sortie obtienne la sortie sur stdout.
curl -o - http://localhost
Pour obtenir la réponse avec juste le code de retour http, je pourrais simplement faire
curl -o /dev/null -s -w "%{http_code}\n" http://localhost
J'utilise cette commande pour imprimer le code d'état sans autre sortie. De plus, il effectuera uniquement une demande HEAD et suivra la redirection (respectivement -I
et -L
).
curl -o -I -L -s -w "%{http_code}" http://localhost
Cela facilite grandement la vérification du code d'état dans un script d'intégrité:
sh -c '[ $(curl -o -I -L -s -w "%{http_code}" http://localhost) -eq 200 ]'
le mode verbeux vous dira tout
curl -v http://localhost
J'ai utilisé ceci:
request_cmd="$(curl -i -o - --silent -X GET --header 'Accept: application/json' --header 'Authorization: _your_auth_code==' 'https://example.com')"
Pour obtenir le statut HTTP
http_status=$(echo "$request_cmd" | grep HTTP | awk '{print $2}')
echo $http_status
Pour obtenir le corps de réponse, j'ai utilisé ceci
output_response=$(echo "$request_cmd" | grep body)
echo $output_response
Cette commande
curl http://localhost -w ", %{http_code}"
obtiendra le corps et le statut séparés par des virgules; vous pouvez les séparer pour les faire sortir.
Vous pouvez modifier le délimiteur comme vous le souhaitez.
L'option -i
est celle que vous souhaitez:
curl -i http://localhost
-i, --include Inclure les en-têtes de protocole dans la sortie (H/F)
Sinon, vous pouvez utiliser l'option verbeuse:
curl -v http://localhost
-v, --verbose Rend l'opération plus bavarde
J'ai trouvé cette question parce que je voulais à la fois la réponse et le contenu afin d'ajouter une certaine gestion des erreurs pour l'utilisateur.
Vous pouvez imprimer le code HTTP pour sortir et écrire le contenu dans un autre fichier.
curl -s -o response.txt -w "%{http_code}" http://example.com
Cela vous permet d'utiliser la logique pour décider si la réponse mérite d'être traitée.
http_response=$(curl -s -o response.txt -w "%{http_code}" http://example.com)
if [ $http_response != "200" ]; then
# handle error
else
echo "Server returned:"
cat response.txt
fi
Pour une utilisation programmatique, j'utilise les éléments suivants:
curlwithcode() {
code=0
# Run curl in a separate command, capturing output of -w "%{http_code}" into statuscode
# and sending the content to a file with -o >(cat >/tmp/curl_body)
statuscode=$(curl -w "%{http_code}" \
-o >(cat >/tmp/curl_body) \
"$@"
) || code="$?"
body="$(cat /tmp/curl_body)"
echo "statuscode : $statuscode"
echo "exitcode : $code"
echo "body : $body"
}
curlwithcode https://api.github.com/users/tj
Il montre la sortie suivante:
statuscode : 200
exitcode : 0
body : {
"login": "tj",
"id": 25254,
...
}