Comment puis-je voir les en-têtes de demande créés par curl lors de l'envoi d'une demande au serveur?


Réponses:


501

Je pense que curl -vc'est le plus simple. Il crachera les en-têtes de demande (lignes préfixées par '>') sans avoir à écrire dans un fichier:

$ curl -v -I -H "Testing: Test header so you see this works" http://stackoverflow.com/
* About to connect() to stackoverflow.com port 80 (#0)
*   Trying 69.59.196.211... connected
* Connected to stackoverflow.com (69.59.196.211) port 80 (#0)
> HEAD / HTTP/1.1
> User-Agent: curl/7.16.3 (i686-pc-cygwin) libcurl/7.16.3 OpenSSL/0.9.8h zlib/1.2.3 libssh2/0.15-CVS
> Host: stackoverflow.com
> Accept: */*
> Testing: Test header so you see this works
>
< HTTP/1.0 200 OK
...

58
curl -v -D - stackoverflow.com -o / dev / null (afin de ne pas afficher le contenu de tout le site, juste les en-têtes)
omnomnom

20
curl -Ivs http://example.com > /dev/null: -Ipour une HEADdemande, -vpour afficher les en-têtes envoyés, -spour masquer la barre de progression, > /dev/nullpour afficher uniquement la sortie -v, en évitant les doublons.
ici le

@PiotrekDe -D -était soigné, mais ne m'a pas été utile car il reproduisait simplement les en-têtes qui -vs'affichaient déjà. Si vous voulez qu'ils ne soient pas préfixés pour une consommation automatisée de la machine, alors ce serait peut-être mieux dans ce cas, mais je voulais seulement entrevoir plus en détail ce qu'était un problème.
Pysis

1
Il y a deux fonctionnalités très utiles du drapeau "verbeux": premièrement, il imprime également le processus de prise de contact TLS lors de l'accès au site Web via HTTPS, comme curl -v https://www.example.com; deuxièmement, il imprime également la CONNECTdemande si vous visitez le site via un proxy HTTP , tel que curl --proxy my-proxy:8080 http://www.example.com. Je crois que cela aiderait plus d'utilisateurs si quelques exemples de ces deux fonctionnalités sont mentionnés dans cette réponse.
Franklin Yu

1
TL; DR: Ne pas utiliser-I Dans le monde moderne, lorsque les gens demandent à voir les en-têtes, ils parlent probablement d'API. Et si vous utilisez cette -Imentalité "J'utilise pour voir les en-têtes avec mon serveur web Apache", vous allez perdre beaucoup de temps à développer une HEADméthode que vous avez probablement l'intention d'utiliser GET. Arrêtez de dire aux gens d'utiliser -I. S'ils le souhaitent HEAD, utilisez -X HEAD(TWSS)
Bruno Bronosky

141

La question n'a pas précisé si la commande de ligne de commande nommée curlétait destinée ou la bibliothèque cURL entière.

Le code PHP suivant utilisant la bibliothèque cURL utilise le premier paramètre comme méthode HTTP (par exemple "GET", "POST", "OPTIONS") et le deuxième paramètre comme URL.

<?php
$ch = curl_init();
$f = tmpfile(); # will be automatically removed after fclose()
curl_setopt_array($ch, array(
    CURLOPT_CUSTOMREQUEST  => $argv[1],
    CURLOPT_URL            => $argv[2], 
    CURLOPT_RETURNTRANSFER => 1,
    CURLOPT_FOLLOWLOCATION => 0,
    CURLOPT_VERBOSE        => 1,
    CURLOPT_HEADER         => 0,
    CURLOPT_CONNECTTIMEOUT => 5,
    CURLOPT_TIMEOUT        => 30,
    CURLOPT_STDERR         => $f,
));
$response = curl_exec($ch);
fseek($f, 0);
echo fread($f, 32*1024); # output up to 32 KB cURL verbose log
fclose($f);
curl_close($ch);
echo $response;

Exemple d'utilisation:

php curl-test.php OPTIONS https://google.com

Notez que les résultats sont presque identiques à la ligne de commande suivante

curl -v -s -o - -X OPTIONS https://google.com

C'est la meilleure réponse, car le fichier utilisé dans cette méthode contient tout dans curl_getinfo () référencé ci-dessous, ainsi que plus de détails sur la demande et la réponse.
Mike_K

3
Vous pouvez utiliser CURLOPT_WRITEHEADER pour les informations d'en-tête et CURLOPT_FILE pour l'ensemble du transfert
sturrockad

1
Gardez à l'esprit que si la connexion est refusée, les fichiers spécifiés avec CURLOPT_WRITEHEADER et CURLOPT_FILEsont vides.
vu le

34
Qui a dit quoi que ce soit à propos de l'utilisationphp?
Eddie B

1
J'ai voté pour votre réponse parce que bien que la question ne soit pas liée au php, votre réponse basée sur le php m'a pointé dans la bonne direction pour résoudre mon propre problème avec l'envoi d'un jeton de porteur. Je vous remercie. J'ai indiqué ma raison ici uniquement dans la vaine tentative de faire apparaître cette question dans les futures recherches google pour les développeurs php avec un problème similaire.
Chris

49

La seule façon dont j'ai réussi à voir mes en-têtes sortants (boucle avec php) était d'utiliser les options suivantes:

curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLINFO_HEADER_OUT, true);

Obtenir vos informations de débogage:

$data = curl_exec($ch);
var_dump($data);
var_dump(curl_getinfo($ch));

1
Pour moi, cela semblait être l'en-tête de réponse et non l'en-tête sortant.
Toby

3
var_dump $datarenverra les en-têtes de réponse ainsi que le corps de réponse. Le var_dump curl_getinfo($ch)vous donnera les en-têtes de demande.
Jrgns

2
CURLOPT_HEADERest l'en-tête de réponse - CURLINFO_HEADER_OUTest l'en-tête de la demande. C'est ce que le PO demande :)
Richard Parnaby-King

44

L' --trace-asciioption curl affichera les en-têtes de demande, ainsi que les en-têtes de réponse et le corps de réponse.

Par exemple, la commande

curl --trace-ascii curl.trace http://www.google.com/ 

produit un fichier curl.tracequi commence comme suit:

== Info: About to connect() to www.google.com port 80 (#0)
== Info:   Trying 209.85.229.104... == Info: connected
== Info: Connected to www.google.com (209.85.229.104) port 80 (#0)
=> Send header, 145 bytes (0x91)
0000: GET / HTTP/1.1
0010: User-Agent: curl/7.16.3 (powerpc-apple-darwin9.0) libcurl/7.16.3
0050:  OpenSSL/0.9.7l zlib/1.2.3
006c: Host: www.google.com
0082: Accept: */*
008f: 

Il a également obtenu une réponse (une réponse 302, pour être précis mais non pertinent) qui a été enregistrée.


Si vous souhaitez uniquement enregistrer les en- têtes de réponse , utilisez l' --dump-headeroption:

curl -D file url
curl --dump-header file url

Si vous avez besoin de plus d'informations sur les options disponibles, utilisez curl --help | less(il produit quelques centaines de lignes de sortie mais mentionne beaucoup d'options). Ou trouvez la page de manuel où vous trouverez plus d'explications sur la signification des options.


10
-D vous donne les en- têtes de réponse (comme le fait -I, mais à STDIN). La question demandait les en- têtes de demande .
pr1001

34

curl --trace-ascii {filename} ou utilisez un seul tiret au lieu du nom de fichier pour le faire envoyer à stdout:

curl --trace-ascii - {URL}

CURLOPT_DEBUGFUNCTION si vous utilisez libcurl

Cela vous montre tout ce que curl envoie et reçoit, avec quelques informations supplémentaires.


1
C'est très verbeux, mais vous montre certainement tout ce que vous devez savoir.
tripleee

27

J'ai essayé les réponses ici et j'ai trouvé que la plus utile et la plus simple n'était pas encore répertoriée comme réponse, mais c'est:

curl -v https://example.com/path

Cela imprime les en- têtes REQUEST ainsi que les en- têtes RESPONSE ainsi que d'autres utiles tels que le certificat SSL et si une connexion TCP existante a été réutilisée. le -vdrapeau peut être combiné avec d'autres drapeaux, bien sûr, comme pour suivre les redirections et demander l'authentification HTTP:

curl -vL --user my_username https://example.com/path

J'espère que cela t'aides.


2
Il est listé au premier rang
Pmpr

19

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 «<»

11

Je sais que c'est un peu tard, mais ma méthode préférée pour le faire est netcatque vous obtenez exactement ce qui a été curlenvoyé; cela peut différer des options --traceou --trace-asciiqui n'afficheront pas correctement les caractères non ASCII (ils apparaissent simplement sous forme de points ou doivent être décodés).

Vous pouvez le faire très facilement en ouvrant deux fenêtres de terminal, dans le premier type:

nc -l localhost 12345

Cela ouvre un processus d'écoute sur le port 12345 de votre machine locale.

Dans la deuxième fenêtre du terminal, entrez votre commande curl, par exemple:

curl --form 'foo=bar' localhost:12345

Dans la première fenêtre du terminal, vous verrez exactement ce que curl a envoyé dans la demande.

Maintenant, bien sûr nc, n'enverra rien en réponse (à moins que vous ne le saisissiez vous-même), vous devrez donc interrompre la commande curl (control-c) et répéter le processus pour chaque test.

Cependant, c'est une option utile pour simplement déboguer votre demande, car vous n'impliquez aucun aller-retour nulle part, ou ne produisez pas de fausses demandes itératives quelque part jusqu'à ce que vous ayez bien compris; une fois que vous êtes satisfait de la commande, redirigez-la simplement vers une URL valide et vous êtes prêt à partir.

Vous pouvez faire de même pour n'importe quelle bibliothèque cURL, modifiez simplement votre demande pour pointer vers l' ncécouteur local jusqu'à ce que vous en soyez satisfait.


6

vider les en-têtes dans un fichier et la charge utile de la réponse dans un autre fichier

curl -k -v -u user:pass  "url" --trace-ascii headers.txt >> response.txt

5
curl -s -v -o / dev / null -H "En-tête de test: test" http://www.example.com

Vous pouvez également utiliser l' -Ioption si vous souhaitez envoyer une demande HEAD et non une demande GET.


3

Voici mon client http en php pour faire des requêtes post avec des cookies inclus:

function http_login_client($url, $params = "", $cookies_send = "" ){

    // Vars
    $cookies = array();
    $headers = getallheaders();

    // Perform a http post request to $ur1 using $params
    $ch = curl_init($url);
    $options = array(   CURLOPT_POST => 1,
                        CURLINFO_HEADER_OUT => true,
                        CURLOPT_POSTFIELDS => $params,
                        CURLOPT_RETURNTRANSFER => 1,
                        CURLOPT_HEADER => 1,
                        CURLOPT_COOKIE => $cookies_send,
                        CURLOPT_USERAGENT => $headers['User-Agent']
                    );

    curl_setopt_array($ch, $options);

    $response = curl_exec($ch);

/// DEBUG info echo $ response; var_dump (curl_getinfo ($ ch)); ///

    // Parse response and read cookies
    preg_match_all('/^Set-Cookie: (.*?)=(.*?);/m', $response, $matches);

    // Build an array with cookies
    foreach( $matches[1] as $index => $cookie )
        $cookies[$cookie] = $matches[2][$index];

    return $cookies;
} // end http_login_client

3

Vous pouvez le voir en utilisant -iv

$> curl  -ivH "apikey:ad9ff3d36888957" --form  "file=@/home/mar/workspace/images/8.jpg" --form "language=eng" --form "isOverlayRequired=true" https://api.ocr.space/Parse/Image

1

Vous pouvez utiliser Wireshark ou tcpdump pour consulter le trafic réseau (http aussi).


11
si la charge utile est sur HTTPS, celles-ci sont inutiles sans un proxy ou un moniteur de couche d'application.
p00ya

1

Faites un exemple de demande à https://http-tools.appspot.com/reflect-http-request/some-unique-id et vérifiez ce que contient cette demande (en-tête de demande, corps de demande, paramètres de demande) par son URL de recherche correspondante https : //http-tools.appspot.com/reflect-http-request-finder/some-unique-id . Vous pouvez utiliser n'importe quelle chaîne à la place de some-unique-id, consultez https://http-tools.appspot.com pour plus de détails.


1
Merci, sans répondre exactement à la question, c'est exactement ce dont j'avais besoin. Le périphérique A fait une demande, le périphérique B vérifie qu'une demande a été effectuée.
domen
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.