Ich möchte die Anforderungsheader sehen, die erstellt wurden, curlwenn ich eine Anforderung an den Server sende. Wie kann ich das überprüfen?
Ich möchte die Anforderungsheader sehen, die erstellt wurden, curlwenn ich eine Anforderung an den Server sende. Wie kann ich das überprüfen?
Antworten:
Ich denke curl -vist 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: -Ifür eine HEADAnforderung, -vum gesendete Header anzuzeigen, -sden Fortschrittsbalken auszublenden und > /dev/nullnur die Ausgabe -v anzuzeigen, um Doppelarbeit zu vermeiden.
-D -war ordentlich, aber für mich nicht nützlich, da es einfach die -vbereits 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 CONNECTAnforderung 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 -IMentalität "Ich verwende , um die Header mit meinem Apache-Webserver zu sehen" verwenden, werden Sie viel Zeit damit verschwenden, sich gegen eine HEADMethode 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 curloder 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_FILEleer 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 $datagibt die Antwortheader sowie den Antworttext zurück. Der var_dump curl_getinfo($ch)gibt Ihnen die Anforderungsheader.
CURLOPT_HEADERist der Antwortheader - CURLINFO_HEADER_OUTist der Anforderungsheader. Dies ist, was die OP verlangt :)
Die --trace-asciiOption 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-headerOption:
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 -vFlag 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 curlgesendet wurde. Dies kann von den Optionen --traceoder abweichen, bei --trace-asciidenen 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 ncnichts 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 ncListener 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 -IOption 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-idSie unter https://http-tools.appspot.com .