Wie kann ich die von curl erstellten Anforderungsheader anzeigen, wenn eine Anforderung an den Server gesendet wird?

485

Ich möchte die Anforderungsheader sehen, die erstellt wurden, curlwenn ich eine Anforderung an den Server sende. Wie kann ich das überprüfen?

Jonathan Leffler
quelle
Diese URL kann hilfreich sein. helloacm.com/curl
doctorlai
1
Sie können dies verwenden, um run-node.com/now-use-curl-with-http-echo-com
John Williams

Antworten:

501

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
...
Steven Kryskalla
quelle
58
curl -v -D - stackoverflow.com -o / dev / null (um nicht den gesamten Inhalt der Site anzuzeigen, sondern nur die
Überschriften
20
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.
hier
@PiotrekDe -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.
Pysis
1
Es gibt zwei sehr hilfreiche Funktionen des "ausführlichen" Flags: Erstens druckt es auch den TLS-Handshake-Prozess, wenn über HTTPS auf eine Website zugegriffen wird, wie z 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.
Franklin Yu
1
TL; DR: Nicht verwenden-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)
Bruno Bronosky
141

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
Tash Pemhiwa
quelle
Dies ist die beste Antwort, da die in dieser Methode verwendete Datei alles in curl_getinfo () enthält, auf das unten verwiesen wird, sowie weitere Details sowohl zur Anforderung als auch zur Antwort.
Mike_K
3
Sie können CURLOPT_WRITEHEADER für die Header-Informationen und CURLOPT_FILE für die gesamte Übertragung verwenden
sturrockad
1
Beachten Sie, dass bei Ablehnung der Verbindung Dateien angegeben werden, die mit angegeben wurden CURLOPT_WRITEHEADER und CURLOPT_FILEleer sind.
eithed
34
Wer hat etwas über die Verwendung gesagtphp?
Eddie B
1
Ich habe Ihre Antwort positiv bewertet, da Ihre Frage, obwohl die Frage nicht mit PHP zu tun hatte, mich in die richtige Richtung wies, um mein eigenes Problem mit dem Senden eines Inhaber-Tokens zu lösen. Vielen Dank. Ich habe meinen Grund hier nur in dem vergeblichen Versuch angegeben, diese Frage in zukünftigen Google-Suchen nach PHP-Entwicklern mit einem ähnlichen Problem auftauchen zu lassen.
Chris
49

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));
Kniganapolke
quelle
1
Für mich schien das der Antwortheader zu sein, nicht der ausgehende Header.
Toby
3
var_dump $datagibt die Antwortheader sowie den Antworttext zurück. Der var_dump curl_getinfo($ch)gibt Ihnen die Anforderungsheader.
Jrgns
2
CURLOPT_HEADERist der Antwortheader - CURLINFO_HEADER_OUTist der Anforderungsheader. Dies ist, was die OP verlangt :)
Richard Parnaby-King
44

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.

Jonathan Leffler
quelle
10
-D gibt Ihnen die Antwort - Header (wie auch -I, sondern STDIN). Die Frage wurde nach den Anforderungsheadern gestellt .
pr1001
34

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.

Daniel Stenberg
quelle
1
Dies ist sehr ausführlich, zeigt Ihnen aber auf jeden Fall alles, was Sie wissen müssen.
Tripleee
27

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.

GregT
quelle
2
Es ist an der obersten Stelle aufgeführt
Pmpr
19

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) entfernen
  • 2>&1 - kombinieren Sie stdout und stderr zu einem einzigen stdout
  • sed - 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 '<'
Igorpcholkin
quelle
11

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.

Haravikk
quelle
6

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
Barry Knapp
quelle
5
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.

Juancholas
quelle
3

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
Tsvetan Filev
quelle
3

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
Jekatandilburg
quelle
1

Sie können wireshark oder tcpdump verwenden , um den Netzwerkverkehr (auch http) zu überprüfen .

Paweł Polewicz
quelle
11
Wenn die Nutzdaten über HTTPS liegen, sind diese ohne Proxy- oder Anwendungsschichtmonitor unbrauchbar.
p00ya
1

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 .

Visruth
quelle
1
Danke, obwohl ich die Frage nicht genau beantworte, ist dies genau das, was ich brauchte. Gerät A stellt eine Anfrage, Gerät B prüft, ob eine Anfrage gestellt wurde.
Domen