Comment afficher les en-têtes de demande avec la boucle de ligne de commande
568
La boucle de ligne de commande peut afficher l'en-tête de réponse en utilisant l' -Doption, mais je veux voir quel en-tête de demande elle envoie. Comment puis je faire ça?
curl --head http://google.comfera la même chose que le -Idrapeau :)
Abel Terefe
9
Remarque sur l'utilisation de --head/ -I: tous les serveurs ne répondent pas exactement de la même manière aux HEADdemandes (par exemple, Content-Encodingseraient manquants si vous tentiez de vérifier que le corps serait compressé) et tous les serveurs ne sont pas pris en charge HEAD. -vest généralement le choix le plus sûr.
Lisez la question - c'est pour les en-têtes de réponse et non les en
Graeme Stuart
58
Cette réponse m'est utile car j'ai également mal lu la question.
Liam
2
Cette commande est un peu différente pour Windows: curl -sD - -o NULL http://example.com
Sergey Vlasov
2
@SergeyVlasov En fait, l'équivalent de /dev/nullWindows ne l'est nulpas null.
Francisco Zarabozo
2
Même si cette question demande des en-têtes de demande, Google dirige ici tous ceux qui recherchent des en-têtes de réponse, nous sommes donc tous heureux que cette réponse soit ici. Et cette réponse est la meilleure pour obtenir des en-têtes de réponse. Merci!!!
biomiker
96
Je crois que le commutateur de ligne de commande que vous recherchez pour passer à curl est -I.
De plus, si vous rencontrez un code d'état HTTP de réponse de 301, vous aimerez peut-être également passer un -Lcommutateur d'argument pour indiquer curlde suivre les redirections d'URL et, dans ce cas, imprimer les en-têtes de toutes les pages (y compris les redirections d'URL), illustrées ci-dessous :
L' -Ioption affiche les en- têtes de réponse . La question portait sur les en- têtes de demande .
Asaph
53
Les -Ioptions obligent curl à faire un HTTP HEAD, ce qui pourrait changer la réponse du serveur. Mieux vaut utiliser le -vcommutateur je crois.
acw
1
Si vous essayez ceci avec autre chose qu'une HEADrequête (comme -X POST) et obtenez "Vous ne pouvez sélectionner qu'une seule requête HTTP!" que stackoverflow.com/questions/286982/… vous aidera probablement. Le truc, c'est que ça -Ifait une HEADrequête, comme acwindiqué et quand votre curlappel est configuré pour faire un autre appel vous avez deux requêtes HTTP en curlappel ...
grippe
7
C'est une très mauvaise réponse. (Je promets que je suis généralement très gentil ici.) 1. Cela fait le contraire de ce que le PO demande. 2. Il utilise une méthode de demande HEADau lieu de GETou POST. 3. Il ne doit JAMAIS être utilisé pour "voir uniquement les en-têtes", sauf si vous essayez de voir comment votre serveur répond différemment à a HEADplutôt qu'à a GET. Ce sera la même chose la plupart du temps, mais pas toujours. Pour voir uniquement les en-têtes utiliser curl -o /dev/null -D /dev/stdout. Cela donnera les résultats attendus 100% du temps.
Bruno Bronosky
79
L'option verbeuse est pratique, mais si vous voulez voir tout ce que fait curl (y compris le corps HTTP qui est transmis, et pas seulement les en-têtes), je suggère d'utiliser l'une des options ci-dessous:
Je ne pense pas, car cela montre aussi les en-têtes et le corps de la réponse!
Pmpr
56
Vous obtenez une belle sortie d'en-tête avec la commande suivante:
curl -L -v -s -o /dev/null google.de
-L, --location suivre les redirections
-v, --verbose plus de sortie, indique la direction
-s, --silent n'affiche pas de barre de progression
-o, --output /dev/null ne montre pas le corps reçu
Ou la version plus courte:
curl -Lvso /dev/null google.de
Résulte en:
*Rebuilt URL to: google.de/*Trying2a00:1450:4008:802::2003...*Connected to google.de (2a00:1450:4008:802::2003) port 80(#0)> GET / HTTP/1.1>Host: google.de
>User-Agent: curl/7.43.0>Accept:*/*>< HTTP/1.1301MovedPermanently<Location: http://www.google.de/<Content-Type: text/html; charset=UTF-8<Date:Fri,12Aug201615:45:36 GMT
<Expires:Sun,11Sep201615:45:36 GMT
<Cache-Control: public, max-age=2592000<Server: gws
<Content-Length:218< X-XSS-Protection:1; mode=block
< X-Frame-Options: SAMEORIGIN
<*Ignoring the response-body
{[218 bytes data]*Connection#0 to host google.de left intact*Issue another request to this URL:'http://www.google.de/'*Trying2a00:1450:4008:800::2003...*Connected to www.google.de (2a00:1450:4008:800::2003) port 80(#1)> GET / HTTP/1.1>Host: www.google.de
>User-Agent: curl/7.43.0>Accept:*/*>< HTTP/1.1200 OK
<Date:Fri,12Aug201615:45:36 GMT
<Expires:-1<Cache-Control: private, max-age=0<Content-Type: text/html; charset=ISO-8859-1< P3P: CP="This is not a P3P policy! See https://www.google.com/support/accounts/answer/151657?hl=en for more info."<Server: gws
< X-XSS-Protection:1; mode=block
< X-Frame-Options: SAMEORIGIN
<Set-Cookie: NID=84=Z0WT_INFoDbf_0FIe_uHqzL9mf3DMSQs0mHyTEDAQOGY2sOrQaKVgN2domEw8frXvo4I3x3QVLqCH340HME3t1-6gNu8R-ArecuaneSURXNxSXYMhW2kBIE8Duty-_w7; expires=Sat,11-Feb-201715:45:36 GMT; path=/; domain=.google.de;HttpOnly<Accept-Ranges: none
<Vary:Accept-Encoding<Transfer-Encoding: chunked
<{[11080 bytes data]*Connection#1 to host www.google.de left intact
Comme vous pouvez le voir, curlles en-têtes sortants et entrants sont sortis et les bodydata sont ignorés, vous indiquant la taille du corps.
De plus, pour chaque ligne, la direction est indiquée afin qu'elle soit facile à lire. J'ai trouvé particulièrement utile de retracer de longues chaînes de redirections.
J'aime mieux que l' -voption avec des votes plus élevés. En outre, juste par souci de concision , cela peut aussi être curl -Lvso /dev/null <target>aussi longtemps que le ovient à la fin.
cri
12
Une commande comme celle ci-dessous affichera trois sections: en-têtes de demande, en-têtes de réponse et données (séparés par CRLF). Il évite les informations techniques et le bruit syntaxique ajouté par curl.
J'ai dû surmonter ce problème moi-même lors du débogage d'applications Web. -vest super, mais un peu trop verbeux à mon goût. Ceci est la solution (bash uniquement) que j'ai trouvée:
curl -v http://example.com/ 2> >(sed '/^*/d')
Cela fonctionne car la sortie de -vest envoyée à stderr, pas à stdout. En redirigeant cela vers un sous-shell, nous pouvons sedle supprimer des lignes commençant par *. Comme la sortie réelle ne passe pas par le sous-shell, elle n'est pas affectée. L'utilisation d'un sous-shell est un peu compliquée, mais c'est le moyen le plus simple de rediriger stderr vers une autre commande. (Comme je l'ai noté, je ne l'utilise que pour les tests, donc cela fonctionne bien pour moi.)
l'option -v pour curl est trop verbeuse dans la sortie d'erreur qui contient le début *(ligne d'état) ou >(champ d'en-tête de demande) ou <(champ d'en-tête de réponse). pour obtenir uniquement le champ de tête de demande:
afin de filtrer la -vsortie, vous devez diriger la sortie d'erreur vers le terminal et la sortie std vers / dev / null, l'option -s est d'interdire la mesure de progression
Si vous voulez plus d'alternatives, vous pouvez essayer d'installer un client HTTP en ligne de commande moderne comme httpie qui est disponible pour la plupart des systèmes d'exploitation avec des gestionnaires de paquets comme brew, apt-get, pip, yum etc.
par exemple: - Pour OSX
brew install httpie
Ensuite, vous pouvez l' utiliser en ligne de commande avec diverses options
curl --head http://google.com
fera la même chose que le-I
drapeau :)--head
/-I
: tous les serveurs ne répondent pas exactement de la même manière auxHEAD
demandes (par exemple,Content-Encoding
seraient manquants si vous tentiez de vérifier que le corps serait compressé) et tous les serveurs ne sont pas pris en chargeHEAD
.-v
est généralement le choix le plus sûr.Réponses:
curl
-v
ou l'--verbose
option affiche, entre autres, les en-têtes de requête HTTP. Voici quelques exemples de sortie:la source
Une réponse populaire pour afficher les en- têtes de réponse , mais OP a demandé des en- têtes de demande .
-s
: Éviter d'afficher la barre de progression-D -
: Vider les en-têtes dans un fichier, mais l'-
envoie à stdout-o /dev/null
: Ignorer le corps de réponseC'est mieux que
-I
car il n'envoie pas deHEAD
demande, ce qui peut produire des résultats différents.C'est mieux que
-v
parce que vous n'avez pas besoin de tant de hacks pour le supprimer.la source
curl -sD - -o NULL http://example.com
/dev/null
Windows ne l'estnul
pasnull
.Je crois que le commutateur de ligne de commande que vous recherchez pour passer à curl est
-I
.Exemple d'utilisation:
De plus, si vous rencontrez un code d'état HTTP de réponse de 301, vous aimerez peut-être également passer un
-L
commutateur d'argument pour indiquercurl
de suivre les redirections d'URL et, dans ce cas, imprimer les en-têtes de toutes les pages (y compris les redirections d'URL), illustrées ci-dessous :la source
-I
option affiche les en- têtes de réponse . La question portait sur les en- têtes de demande .-I
options obligent curl à faire unHTTP HEAD
, ce qui pourrait changer la réponse du serveur. Mieux vaut utiliser le-v
commutateur je crois.HEAD
requête (comme-X POST
) et obtenez "Vous ne pouvez sélectionner qu'une seule requête HTTP!" que stackoverflow.com/questions/286982/… vous aidera probablement. Le truc, c'est que ça-I
fait uneHEAD
requête, commeacw
indiqué et quand votrecurl
appel est configuré pour faire un autre appel vous avez deux requêtes HTTP encurl
appel ...HEAD
au lieu deGET
ouPOST
. 3. Il ne doit JAMAIS être utilisé pour "voir uniquement les en-têtes", sauf si vous essayez de voir comment votre serveur répond différemment à aHEAD
plutôt qu'à aGET
. Ce sera la même chose la plupart du temps, mais pas toujours. Pour voir uniquement les en-têtes utilisercurl -o /dev/null -D /dev/stdout
. Cela donnera les résultats attendus 100% du temps.L'option verbeuse est pratique, mais si vous voulez voir tout ce que fait curl (y compris le corps HTTP qui est transmis, et pas seulement les en-têtes), je suggère d'utiliser l'une des options ci-dessous:
--trace-ascii -
# stdout--trace-ascii output_file.txt
# fichierla source
Vous obtenez une belle sortie d'en-tête avec la commande suivante:
-L, --location
suivre les redirections-v, --verbose
plus de sortie, indique la direction-s, --silent
n'affiche pas de barre de progression-o, --output /dev/null
ne montre pas le corps reçuOu la version plus courte:
Résulte en:
Comme vous pouvez le voir,
curl
les en-têtes sortants et entrants sont sortis et les bodydata sont ignorés, vous indiquant la taille du corps.De plus, pour chaque ligne, la direction est indiquée afin qu'elle soit facile à lire. J'ai trouvé particulièrement utile de retracer de longues chaînes de redirections.
la source
-v
option avec des votes plus élevés. En outre, juste par souci de concision , cela peut aussi êtrecurl -Lvso /dev/null <target>
aussi longtemps que leo
vient à la fin.Une commande comme celle ci-dessous affichera trois sections: en-têtes de demande, en-têtes de réponse et données (séparés par CRLF). Il évite les informations techniques et le bruit syntaxique ajouté par curl.
La commande produira la sortie suivante:
La description:
-vs
- ajouter des en-têtes (-v) mais supprimer la barre de progression (-s)2>&1
- combiner stdout et stderr en une seule stdoutsed
- modifier la réponse produite par curl en utilisant les commandes ci-dessous/^* /d
- supprimer les lignes commençant par '*' (info technique)/bytes data]$/d
- supprimer les lignes se terminant par 'bytes data]' (info technique)s/> //
- supprimer le préfixe '>'s/< //
- supprimer le préfixe «<»la source
J'ai dû surmonter ce problème moi-même lors du débogage d'applications Web.
-v
est super, mais un peu trop verbeux à mon goût. Ceci est la solution (bash uniquement) que j'ai trouvée:Cela fonctionne car la sortie de
-v
est envoyée à stderr, pas à stdout. En redirigeant cela vers un sous-shell, nous pouvonssed
le supprimer des lignes commençant par*
. Comme la sortie réelle ne passe pas par le sous-shell, elle n'est pas affectée. L'utilisation d'un sous-shell est un peu compliquée, mais c'est le moyen le plus simple de rediriger stderr vers une autre commande. (Comme je l'ai noté, je ne l'utilise que pour les tests, donc cela fonctionne bien pour moi.)la source
l'option -v pour curl est trop verbeuse dans la sortie d'erreur qui contient le début
*
(ligne d'état) ou>
(champ d'en-tête de demande) ou<
(champ d'en-tête de réponse). pour obtenir uniquement le champ de tête de demande:pour obtenir uniquement le champ de tête de demande:
ou pour le vider dans un
/tmp/test.txt
fichier avec l'option -Dafin de filtrer la
-v
sortie, vous devez diriger la sortie d'erreur vers le terminal et la sortie std vers / dev / null, l'option -s est d'interdire la mesure de progressionla source
Si vous voulez plus d'alternatives, vous pouvez essayer d'installer un client HTTP en ligne de commande moderne comme httpie qui est disponible pour la plupart des systèmes d'exploitation avec des gestionnaires de paquets comme brew, apt-get, pip, yum etc.
par exemple: - Pour OSX
Ensuite, vous pouvez l' utiliser en ligne de commande avec diverses options
la source