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?

wwwxml
la source
28
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.
cfeduke

Réponses:

752

curl -vou l' --verboseoption affiche, entre autres, les en-têtes de requête HTTP. Voici quelques exemples de sortie:

$ curl -v http://google.com/
* About to connect() to google.com port 80 (#0)
*   Trying 66.102.7.104... connected
* Connected to google.com (66.102.7.104) port 80 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.16.4 (i386-apple-darwin9.0) libcurl/7.16.4 OpenSSL/0.9.7l zlib/1.2.3
> Host: google.com
> Accept: */*
> 
< HTTP/1.1 301 Moved Permanently
< Location: http://www.google.com/
< Content-Type: text/html; charset=UTF-8
< Date: Thu, 15 Jul 2010 06:06:52 GMT
< Expires: Sat, 14 Aug 2010 06:06:52 GMT
< Cache-Control: public, max-age=2592000
< Server: gws
< Content-Length: 219
< X-XSS-Protection: 1; mode=block
< 
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="http://www.google.com/">here</A>.
</BODY></HTML>
* Connection #0 to host google.com left intact
* Closing connection #0
Asaph
la source
6
Que se passe-t-il si je veux simplement construire le package mais que je ne veux pas l'envoyer?
PuercoPop
@jacobsimeon Je pense que c'est parce qu'il montre non seulement les en- têtes Request mais aussi les en- têtes Response et le corps Response .
Pmpr
236

Une réponse populaire pour afficher les en- têtes de réponse , mais OP a demandé des en- têtes de demande .

curl -s -D - -o /dev/null http://example.com
  • -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éponse

C'est mieux que -Icar il n'envoie pas de HEADdemande, ce qui peut produire des résultats différents.

C'est mieux que -vparce que vous n'avez pas besoin de tant de hacks pour le supprimer.

JaffaTheCake
la source
17
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.

Exemple d'utilisation:

$ curl -I http://heatmiser.counterhack.com/zone-5-15614E3A-CEA7-4A28-A85A-D688CC418287  
HTTP/1.1 301 Moved Permanently
Date: Sat, 29 Dec 2012 15:22:05 GMT
Server: Apache
Location: http://heatmiser.counterhack.com/zone-5-15614E3A-CEA7-4A28-A85A-D688CC418287/
Content-Type: text/html; charset=iso-8859-1

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 :

$ curl -I -L http://heatmiser.counterhack.com/zone-5-15614E3A-CEA7-4A28-A85A-D688CC418287
HTTP/1.1 301 Moved Permanently
Date: Sat, 29 Dec 2012 15:22:13 GMT
Server: Apache
Location: http://heatmiser.counterhack.com/zone-5-15614E3A-CEA7-4A28-A85A-D688CC418287/
Content-Type: text/html; charset=iso-8859-1

HTTP/1.1 302 Found
Date: Sat, 29 Dec 2012 15:22:13 GMT
Server: Apache
Set-Cookie: UID=b8c37e33defde51cf91e1e03e51657da
Location: noaccess.php
Content-Type: text/html

HTTP/1.1 200 OK
Date: Sat, 29 Dec 2012 15:22:13 GMT
Server: Apache
Content-Type: text/html
evandrix
la source
38
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:

  • --trace-ascii - # stdout
  • --trace-ascii output_file.txt # fichier
William Denniss
la source
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/
*   Trying 2a00: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.1 301 Moved Permanently
< Location: http://www.google.de/
< Content-Type: text/html; charset=UTF-8
< Date: Fri, 12 Aug 2016 15:45:36 GMT
< Expires: Sun, 11 Sep 2016 15: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/'
*   Trying 2a00: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.1 200 OK
< Date: Fri, 12 Aug 2016 15: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-2017 15: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.

Benibr
la source
4
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.

curl -vs www.stackoverflow.com 2>&1 | sed '/^* /d; /bytes data]$/d; s/> //; s/< //'

La commande produira la sortie suivante:

GET / HTTP/1.1
Host: www.stackoverflow.com
User-Agent: curl/7.54.0
Accept: */*

HTTP/1.1 301 Moved Permanently
Content-Type: text/html; charset=UTF-8
Location: https://stackoverflow.com/
Content-Length: 149
Accept-Ranges: bytes
Date: Wed, 16 Jan 2019 20:28:56 GMT
Via: 1.1 varnish
Connection: keep-alive
X-Served-By: cache-bma1622-BMA
X-Cache: MISS
X-Cache-Hits: 0
X-Timer: S1547670537.588756,VS0,VE105
Vary: Fastly-SSL
X-DNS-Prefetch-Control: off
Set-Cookie: prov=e4b211f7-ae13-dad3-9720-167742a5dff8; domain=.stackoverflow.com; expires=Fri, 01-Jan-2055 00:00:00 GMT; path=/; HttpOnly

<head><title>Document Moved</title></head>
<body><h1>Object Moved</h1>This document may be found <a HREF="https://stackoverflow.com/">here</a></body>

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 stdout
  • sed - 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 «<»
igorpcholkin
la source
7

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.)

jpfx1342
la source
4

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:

curl -v -sS www.stackoverflow.com 2>&1 >/dev/null | grep '>' | cut -c1-2 --complement

pour obtenir uniquement le champ de tête de demande:

curl -v -sS www.stackoverflow.com 2>&1 >/dev/null | grep '<' | cut -c1-2 --complement

ou pour le vider dans un /tmp/test.txtfichier avec l'option -D

curl -D /tmp/test.txt -sS www.stackoverflow.com > /dev/null

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

toolchainX
la source
1

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

http GET https://www.google.com

entrez la description de l'image ici

Sudharshan
la source