Je veux voir les en-têtes de demande effectués par curl
lorsque j'envoie une demande au serveur. Comment puis-je vérifier cela?
Je veux voir les en-têtes de demande effectués par curl
lorsque j'envoie une demande au serveur. Comment puis-je vérifier cela?
Réponses:
Je pense que curl -v
c'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
...
curl -Ivs http://example.com > /dev/null
: -I
pour une HEAD
demande, -v
pour afficher les en-têtes envoyés, -s
pour masquer la barre de progression, > /dev/null
pour afficher uniquement la sortie -v, en évitant les doublons.
-D -
était soigné, mais ne m'a pas été utile car il reproduisait simplement les en-têtes qui -v
s'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.
curl -v https://www.example.com
; deuxièmement, il imprime également la CONNECT
demande 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.
-I
Dans le monde moderne, lorsque les gens demandent à voir les en-têtes, ils parlent probablement d'API. Et si vous utilisez cette -I
mentalité "J'utilise pour voir les en-têtes avec mon serveur web Apache", vous allez perdre beaucoup de temps à développer une HEAD
mé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)
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
CURLOPT_WRITEHEADER
et CURLOPT_FILE
sont vides.
php?
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));
var_dump $data
renverra 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.
CURLOPT_HEADER
est l'en-tête de réponse - CURLINFO_HEADER_OUT
est l'en-tête de la demande. C'est ce que le PO demande :)
L' --trace-ascii
option 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.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 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-header
option:
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.
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.
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 -v
drapeau 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.
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 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 «<»Je sais que c'est un peu tard, mais ma méthode préférée pour le faire est netcat
que vous obtenez exactement ce qui a été curl
envoyé; cela peut différer des options --trace
ou --trace-ascii
qui 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.
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
curl -s -v -o / dev / null -H "En-tête de test: test" http://www.example.com
Vous pouvez également utiliser l' -I
option si vous souhaitez envoyer une demande HEAD et non une demande GET.
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
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
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.