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?
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
...
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
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));
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.
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.
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.
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 stdoutsed
- é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éfixes/< //
- supprime le préfixe '<'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.
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
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.
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
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
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.