web-dev-qa-db-fra.com

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

Je souhaite voir les en-têtes de requête créés par curl lorsque j'envoie une requête au serveur. Comment puis-je vérifier ça?

442
leela

Je pense que curl -v est le plus facile. Il va cracher les en-têtes de requête (lignes précédées du préfixe '>') 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
...
472
Steven Kryskalla

La question ne spécifiait pas si la commande en ligne de commande nommée curl était signifiée ou la bibliothèque cURL entière.

Le code PHP suivant, qui utilise la bibliothèque cURL, utilise le premier paramètre en tant que méthode HTTP (par exemple, "GET", "POST", "OPTIONS") et le deuxième paramètre en tant qu'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 à ceux de la ligne de commande suivante

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

La seule façon pour moi de voir mes en-têtes sortants (curl avec php) a été 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));
48
Kniganapolke

L'option --trace-ascii de curl affiche les en-têtes de la demande, ainsi que les en-têtes et le corps de la réponse.

Par exemple, la commande

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

produit un fichier curl.trace qui 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 reçu une réponse (une réponse 302, pour être précis mais sans pertinence) qui a été enregistrée.


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

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 de nombreuses options). Ou trouvez le page de manuel où il y a plus d'explications sur la signification des options.

40
Jonathan Leffler

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

curl --trace-ascii - {URL}

CURLOPT_DEBUGFUNCTION si vous utilisez libcurl

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

31
Daniel Stenberg

J'ai essayé les réponses ici et trouvé que la plus utile et la plus facile ne figure pas encore dans la liste des réponses, mais c'est:

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

Ceci affiche les en-têtes REQUEST ainsi que les en-têtes RÉPONSE ainsi que d'autres éléments utiles tels que le certificat SSL et si une connexion existante TCP a été réutilisé. l'indicateur -v peut être combiné à d'autres indicateurs, par exemple pour suivre les redirections et demander une authentification HTTP:

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

J'espère que cela t'aides.

27
GregT

Une commande comme celle ci-dessous affichera trois sections: en-têtes de requête, en-têtes de réponse et données (séparées par CRLF). Cela évite les informations techniques et les bruits syntaxiques ajoutés 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 - ajoute des en-têtes (-v) mais supprime la barre de progression (-s)
  • 2>&1 - combinez stdout et stderr en un seul stdout
  • sed - édite la réponse produite par curl en utilisant les commandes ci-dessous
  • /^* /d - supprime les lignes commençant par '*' (informations techniques)
  • /bytes data]$/d - supprime les lignes se terminant par 'données d'octets]' (informations techniques)
  • s/> // - supprime le préfixe
  • s/< // - supprime le préfixe '<'
10
igorpcholkin

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

Vous pouvez le faire aussi 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 ordinateur local.

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 quel curl a été envoyé dans la requête.

Bien entendu, nc n’envoie rien en réponse (sauf si vous le tapez vous-même); vous devrez donc interrompre la commande curl (control-c) et répéter le processus pour chaque test.

Cependant, il s'agit d'une option utile pour simplement déboguer votre demande, car vous n'impliquez pas d'aller-retour, ni ne produisez de fausses demandes itératives quelque part jusqu'à ce que vous obteniez la solution correcte. 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 la même chose pour n'importe quelle bibliothèque cURL. Modifiez simplement votre demande pour qu'elle pointe vers l'auditeur local nc jusqu'à ce que vous en soyez satisfait.

8
Haravikk

dump les en-têtes dans un fichier et la charge utile de la réponse dans un fichier différent

curl -k -v -u user:pass  "url" --trace-ascii headers.txt >> response.txt
6
Barry Knapp
curl -s -v -o/dev/null -H "Testheader: test" http://www.example.com

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

5
juancholas

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
3
Yekatandilburg

Voici mon client http en php pour faire des requêtes de publication avec les 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
Tsvetan Filev

Faites un exemple de demande à https://http-tools.appspot.com/reflect-http-request/some-unique-id et vérifiez le contenu de cette demande (en-tête de la demande, corps de la demande, paramètres de la demande ) par l’URL correspondante du Finder https://http-tools.appspot.com/reflect-http-request-Finder/some-unique-id . Vous pouvez utiliser n’importe quelle chaîne au lieu de some-unique-id, consultez https://http-tools.appspot.com pour plus de détails.

1
Visruth

Vous pouvez utiliser wireShark ou tcpdump pour rechercher tout trafic sur le réseau (http également).

1
Paweł Polewicz