Ich möchte die Anforderungsheader sehen, die erstellt wurden, curl
wenn ich eine Anforderung an den Server sende. Wie kann ich das überprüfen?
Ich möchte die Anforderungsheader sehen, die erstellt wurden, curl
wenn ich eine Anforderung an den Server sende. Wie kann ich das überprüfen?
Antworten:
Ich denke curl -v
ist das einfachste. Die Anforderungsheader (Zeilen mit dem Präfix '>') werden ausgespuckt, ohne dass in eine Datei geschrieben werden muss:
$ 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
für eine HEAD
Anforderung, -v
um gesendete Header anzuzeigen, -s
den Fortschrittsbalken auszublenden und > /dev/null
nur die Ausgabe -v anzuzeigen, um Doppelarbeit zu vermeiden.
-D -
war ordentlich, aber für mich nicht nützlich, da es einfach die -v
bereits angezeigten Header duplizierte . Wenn Sie möchten, dass sie für den automatisierten Maschinenverbrauch nicht festgelegt sind, ist dies in diesem Fall möglicherweise besser, aber ich wollte nur einen genaueren Blick auf das Problem werfen.
curl -v https://www.example.com
. Zweitens wird die CONNECT
Anforderung auch gedruckt, wenn Sie die Site über einen HTTP-Proxy besuchen , z curl --proxy my-proxy:8080 http://www.example.com
. Ich glaube, es würde mehr Benutzern helfen, wenn einige Beispiele für diese beiden Funktionen in dieser Antwort erwähnt werden.
-I
In der modernen Welt sprechen Leute, die nach Headern fragen, wahrscheinlich über APIs. Und wenn Sie die -I
Mentalität "Ich verwende , um die Header mit meinem Apache-Webserver zu sehen" verwenden, werden Sie viel Zeit damit verschwenden, sich gegen eine HEAD
Methode zu entwickeln, die Sie wahrscheinlich verwenden möchten GET
. Hör auf, den Leuten zu sagen, dass sie es benutzen sollen -I
. Wenn sie wollen HEAD
, verwenden Sie -X HEAD
(TWSS)
In der Frage wurde nicht angegeben, ob der genannte Befehlszeilenbefehl curl
oder die gesamte cURL-Bibliothek gemeint ist.
Der folgende PHP-Code, der die cURL-Bibliothek verwendet, verwendet den ersten Parameter als HTTP-Methode (z. B. "GET", "POST", "OPTIONS") und den zweiten Parameter als 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;
Anwendungsbeispiel:
php curl-test.php OPTIONS https://google.com
Beachten Sie, dass die Ergebnisse fast identisch mit der folgenden Befehlszeile sind
curl -v -s -o - -X OPTIONS https://google.com
CURLOPT_WRITEHEADER
und CURLOPT_FILE
leer sind.
php?
Die einzige Möglichkeit, meine ausgehenden Header (Curl mit PHP) zu sehen, war die Verwendung der folgenden Optionen:
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLINFO_HEADER_OUT, true);
Abrufen Ihrer Debug-Informationen:
$data = curl_exec($ch);
var_dump($data);
var_dump(curl_getinfo($ch));
var_dump $data
gibt die Antwortheader sowie den Antworttext zurück. Der var_dump curl_getinfo($ch)
gibt Ihnen die Anforderungsheader.
CURLOPT_HEADER
ist der Antwortheader - CURLINFO_HEADER_OUT
ist der Anforderungsheader. Dies ist, was die OP verlangt :)
Die --trace-ascii
Option zum Einrollen zeigt die Anforderungsheader sowie die Antwortheader und den Antworttext an.
Zum Beispiel der Befehl
curl --trace-ascii curl.trace http://www.google.com/
Erzeugt eine Datei curl.trace
, die wie folgt beginnt:
== 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:
Es wurde auch eine Antwort (eine 302-Antwort, um genau zu sein, aber irrelevant) erhalten, die protokolliert wurde.
Wenn Sie nur die gespeichert werden soll Antwort - Header, verwenden Sie die --dump-header
Option:
curl -D file url
curl --dump-header file url
Wenn Sie weitere Informationen zu den verfügbaren Optionen benötigen, verwenden Sie curl --help | less
(es werden einige hundert Ausgabezeilen erzeugt, es werden jedoch viele Optionen erwähnt). Oder finden Sie die Handbuchseite, auf der Sie näher erläutern, was die Optionen bedeuten.
curl --trace-ascii {Dateiname} oder verwenden Sie einen einzelnen Bindestrich anstelle des Dateinamens, um ihn an stdout zu senden:
curl --trace-ascii - {URL}
CURLOPT_DEBUGFUNCTION, wenn Sie libcurl verwenden
Dies zeigt Ihnen alles , was Curl sendet und empfängt, mit einigen zusätzlichen Informationen.
Ich habe die Antworten hier ausprobiert und festgestellt, dass die nützlichste und einfachste noch nicht als Antwort aufgeführt ist, aber es ist:
curl -v https://example.com/path
Dadurch werden die REQUEST- Header sowie die RESPONSE- Header und andere nützliche Elemente wie das SSL-Zertifikat und die Frage, ob eine vorhandene TCP-Verbindung wiederverwendet wurde, ausgedruckt. Das -v
Flag kann natürlich mit anderen Flags kombiniert werden, z. B. um Weiterleitungen zu folgen und zur HTTP-Authentifizierung aufzufordern:
curl -vL --user my_username https://example.com/path
Hoffe das hilft.
Ein Befehl wie der folgende zeigt drei Abschnitte: Anforderungsheader, Antwortheader und Daten (durch CRLF getrennt). Es vermeidet technische Informationen und syntaktisches Rauschen, das durch Curl hinzugefügt wird.
curl -vs www.stackoverflow.com 2>&1 | sed '/^* /d; /bytes data]$/d; s/> //; s/< //'
Der Befehl erzeugt die folgende Ausgabe:
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>
Beschreibung:
-vs
- Kopfzeilen hinzufügen (-v), aber Fortschrittsbalken (-s) entfernen2>&1
- kombinieren Sie stdout und stderr zu einem einzigen stdoutsed
- Bearbeiten Sie die durch Curl erzeugte Antwort mit den folgenden Befehlen/^* /d
- Zeilen entfernen, die mit '*' beginnen (technische Informationen)/bytes data]$/d
- Zeilen entfernen, die mit 'Byte-Daten] enden' (technische Informationen)s/> //
- Entfernen Sie das Präfix '>'s/< //
- Entfernen Sie das Präfix '<'Ich weiß, dass dies etwas spät ist, aber meine bevorzugte Methode dafür ist netcat
, dass Sie genau das erhalten, was curl
gesendet wurde. Dies kann von den Optionen --trace
oder abweichen, bei --trace-ascii
denen Nicht-ASCII-Zeichen nicht richtig angezeigt werden (sie werden nur als Punkte angezeigt oder müssen dekodiert werden).
Sie können dies genauso einfach tun, indem Sie zwei Terminalfenster im ersten Typ öffnen:
nc -l localhost 12345
Dies öffnet einen Abhörvorgang an Port 12345 Ihres lokalen Computers.
Geben Sie im zweiten Terminalfenster Ihren Curl-Befehl ein, zum Beispiel:
curl --form 'foo=bar' localhost:12345
Im ersten Terminalfenster sehen Sie genau, welche Locke in der Anfrage gesendet wurde.
Jetzt wird natürlich nc
nichts als Antwort gesendet (es sei denn, Sie geben es selbst ein), daher müssen Sie den Curl-Befehl (control-c) unterbrechen und den Vorgang für jeden Test wiederholen.
Dies ist jedoch eine nützliche Option, um Ihre Anfrage einfach zu debuggen, da Sie nirgendwo einen Roundtrip durchführen oder irgendwo falsche iterative Anfragen erstellen, bis Sie es richtig verstanden haben. Wenn Sie mit dem Befehl zufrieden sind, leiten Sie ihn einfach an eine gültige URL weiter und los geht's.
Sie können dies auch für jede cURL-Bibliothek tun. Bearbeiten Sie einfach Ihre Anfrage, um auf den lokalen nc
Listener zu verweisen, bis Sie damit zufrieden sind.
Speichern Sie die Header in einer Datei und die Nutzdaten der Antwort in einer anderen Datei
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
Sie können die -I
Option auch verwenden, wenn Sie eine HEAD-Anforderung und keine GET-Anforderung senden möchten.
Hier ist mein http-Client in PHP, um Post-Anfragen mit Cookies zu stellen:
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
Sie können es mit sehen -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
Sie können wireshark oder tcpdump verwenden , um den Netzwerkverkehr (auch http) zu überprüfen .
Stellen Sie eine Beispielanforderung an https://http-tools.appspot.com/reflect-http-request/some-unique-id und überprüfen Sie anhand der entsprechenden Finder-URL https , was diese Anforderung enthält (Anforderungsheader, Anforderungshauptteil, Anforderungsparameter) : //http-tools.appspot.com/reflect-http-request-finder/some-unique-id . Sie können stattdessen eine beliebige Zeichenfolge verwenden. Weitere Informationen finden some-unique-id
Sie unter https://http-tools.appspot.com .