web-dev-qa-db-fra.com

Curl pour retourner le code de statut http avec la réponse

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 ]'
20
scriptracer

le mode verbeux vous dira tout

curl -v http://localhost
14
ScotchAndSoda

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
12
user2720864

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.

3
Tech Junkie

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

2
Owen Pauling

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
2
Eddie

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,
  ...
}
0
edi9999