Jak mogę zobaczyć nagłówki żądania wykonane przez curl podczas wysyłania żądania do serwera?

485

Chcę, aby nagłówki żądań były curlprzesyłane do chwili, gdy wysyłam żądanie do serwera. Jak mogę to sprawdzić?

Jonathan Leffler
źródło
ten adres URL może być pomocny. helloacm.com/curl
doctorlai
1
Możesz użyć tego do przetestowania run-node.com/now-use-curl-with-http-echo-com
John Williams

Odpowiedzi:

501

Myślę, że curl -vjest najłatwiejszy. Wypluje nagłówki żądań (wiersze poprzedzone „>”) bez konieczności zapisywania do pliku:

$ 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
źródło
58
curl -v -D - stackoverflow.com -o / dev / null (aby nie wyświetlać zawartości całej witryny, tylko nagłówki)
omnomnom
20
curl -Ivs http://example.com > /dev/null: -Idla HEADżądania, -vaby wyświetlić wysłane nagłówki, -saby ukryć pasek postępu, > /dev/nullaby wyświetlić tylko wyjście -v, unikając powielania.
tutaj
@PiotrekDe -D -był schludny, ale nie był dla mnie przydatny, ponieważ po prostu zduplikował -vjuż wyświetlone nagłówki . Jeśli chcesz, aby nie były one prefiksowane do automatycznego użycia przez maszynę, być może byłoby lepiej w tym przypadku, ale chciałem tylko rzucić okiem na to, jaki problem był bardziej szczegółowo.
Pysis
1
Istnieją dwie bardzo pomocne funkcje flagi „verbose”: po pierwsze, drukuje również proces uzgadniania TLS podczas uzyskiwania dostępu do strony internetowej za pośrednictwem HTTPS, takie jak curl -v https://www.example.com; po drugie, drukuje również CONNECTżądanie, jeśli odwiedzasz witrynę za pośrednictwem serwera proxy HTTP , takiego jak curl --proxy my-proxy:8080 http://www.example.com. Uważam, że pomogłoby to większej liczbie użytkowników, gdyby niektóre przykłady tych dwóch funkcji zostały wymienione w tej odpowiedzi.
Franklin Yu
1
TL; DR: Nie używaj -I We współczesnym świecie, kiedy ludzie pytają o wyświetlanie nagłówków, prawdopodobnie mówią o interfejsach API. A jeśli użyjesz tej -Imentalności „Używam do wyświetlania nagłówków z moim serwerem Apache”, zmarnujesz dużo czasu na rozwijanie się przeciwko HEADmetodzie, którą prawdopodobnie zamierzasz użyć GET. Przestań mówić ludziom, żeby ich używali -I. Jeśli chcą HEAD, użyj -X HEAD(TWSS)
Bruno Bronosky
141

Pytanie nie określało, czy curlchodziło o nazwane polecenie wiersza poleceń , czy całą bibliotekę cURL.

Poniższy kod PHP wykorzystujący bibliotekę cURL używa pierwszego parametru jako metody HTTP (np. „GET”, „POST”, „OPCJE”), a drugiego parametru jako adresu 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;

Przykładowe użycie:

php curl-test.php OPTIONS https://google.com

Zauważ, że wyniki są prawie identyczne z następującymi wierszami poleceń

curl -v -s -o - -X OPTIONS https://google.com
Tash Pemhiwa
źródło
To najlepsza odpowiedź, ponieważ plik użyty w tej metodzie zawiera wszystko w curl_getinfo (), do którego odwołuje się poniżej, a także więcej szczegółów na temat zarówno żądania, jak i odpowiedzi.
Mike_K
3
Możesz użyć CURLOPT_WRITEHEADER jako informacji nagłówka i CURLOPT_FILE dla całego transferu
sturrockad
1
Należy pamiętać, że jeśli połączenie zostanie odrzucone, pliki określone za pomocą CURLOPT_WRITEHEADER i CURLOPT_FILEsą puste.
wyjechał
34
Kto powiedział coś o używaniuphp?
Eddie B
1
Poprosiłem o odpowiedź, ponieważ chociaż pytanie nie było związane z php, odpowiedź oparta na php wskazała mi właściwy kierunek rozwiązania mojego problemu z wysłaniem tokena na okaziciela. Dziękuję Ci. Podałem swój powód tutaj tylko na próżną próbę wyświetlenia tego pytania w przyszłych wyszukiwaniach Google dla programistów php z podobnym problemem.
Chris
49

Jedynym sposobem, w jaki udało mi się zobaczyć moje wychodzące nagłówki (curl z php), było użycie następujących opcji:

curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLINFO_HEADER_OUT, true);

Uzyskiwanie informacji o debugowaniu:

$data = curl_exec($ch);
var_dump($data);
var_dump(curl_getinfo($ch));
Kniganapolke
źródło
1
Dla mnie był to nagłówek odpowiedzi, a nie nagłówek wychodzący.
Toby
3
var_dump $datazwróci nagłówki odpowiedzi oraz treść odpowiedzi. Var_dump curl_getinfo($ch)da ci nagłówki żądania.
Jrgns,
2
CURLOPT_HEADERjest nagłówkiem odpowiedzi - CURLINFO_HEADER_OUTjest nagłówkiem żądania. O to prosi OP :)
Richard Parnaby-King
44

--trace-asciiMożliwość zawinięcia pokaże nagłówków żądania, jak również nagłówki odpowiedzi i reakcji organizmu.

Na przykład polecenie

curl --trace-ascii curl.trace http://www.google.com/ 

tworzy plik, curl.tracektóry zaczyna się w następujący sposób:

== 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: 

Otrzymał również odpowiedź (odpowiedź 302, a dokładniej, ale nieistotna), która została zarejestrowana.


Jeśli chcesz tylko zapisać nagłówki odpowiedzi , użyj --dump-headeropcji:

curl -D file url
curl --dump-header file url

Jeśli potrzebujesz więcej informacji o dostępnych opcjach, użyj curl --help | less(daje kilkaset wierszy wyników, ale wspomina o wielu opcjach). Lub znajdź stronę podręcznika, na której znajduje się więcej wyjaśnień na temat opcji.

Jonathan Leffler
źródło
10
-D daje nagłówki odpowiedzi (podobnie jak -I, ale do STDIN). Pytanie zadane dla nagłówków żądania .
pr1001
34

curl --trace-ascii {nazwa pliku} lub użyj pojedynczego myślnika zamiast nazwy pliku, aby wysłać go na standardowe wyjście:

curl --trace-ascii - {URL}

CURLOPT_DEBUGFUNCTION, jeśli używasz libcurl

To pokazuje ci wszystko , co curl wysyła i odbiera, z dodanymi dodatkowymi informacjami.

Daniel Stenberg
źródło
1
To bardzo szczegółowe, ale z pewnością pokazuje wszystko, co powinieneś wiedzieć.
tripleee
26

Próbowałem tutaj odpowiedzi i okazało się, że najbardziej użyteczna i najłatwiejsza nie jest jeszcze wymieniona jako odpowiedź, ale jest to:

curl -v https://example.com/path

Spowoduje to wydrukowanie nagłówków ZAPYTAŃ, a także nagłówków RESPONSE oraz innych przydatnych, takich jak certyfikat SSL i informacja, czy istniejące połączenie TCP zostało ponownie użyte. -vznacznik może być połączony z innymi flagi, oczywiście, na przykład do przekierowania śledzenia i szybka autoryzacja HTTP:

curl -vL --user my_username https://example.com/path

Mam nadzieję że to pomoże.

GregT
źródło
2
Jest wymieniony na najwyższym miejscu
Pmpr
19

Polecenie takie jak poniższe wyświetli trzy sekcje: nagłówki żądania, nagłówki odpowiedzi i dane (oddzielone przez CRLF). Pozwala to uniknąć informacji technicznych i hałasu syntaktycznego dodawanego przez zwijanie.

curl -vs www.stackoverflow.com 2>&1 | sed '/^* /d; /bytes data]$/d; s/> //; s/< //'

Polecenie wygeneruje następujące dane wyjściowe:

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>

Opis:

  • -vs - dodaj nagłówki (-v), ale usuń pasek postępu (-s)
  • 2>&1 - połącz stdout i stderr w jedno stdout
  • sed - edytuj odpowiedź wygenerowaną przez curl przy użyciu poniższych poleceń
  • /^* /d - usuń wiersze zaczynające się od „*” (informacje techniczne)
  • /bytes data]$/d - usuń wiersze kończące się na „bajty danych]” (informacje techniczne)
  • s/> // - usuń prefiks „>”
  • s/< // - usuń prefiks „<”
Igorpcholkin
źródło
11

Wiem, że to trochę za późno, ale moją ulubioną metodą jest to netcat, że dostajesz dokładnie to, co curlwysłano; może to różnić się od opcji --tracelub, --trace-asciiktóre nie będą poprawnie wyświetlać znaków spoza ASCII (wyświetlają się tylko jako kropki lub wymagają dekodowania).

Możesz to zrobić równie łatwo, otwierając dwa okna terminali, w pierwszym typie:

nc -l localhost 12345

Spowoduje to otwarcie procesu nasłuchiwania na porcie 12345 komputera lokalnego.

W drugim oknie terminala wprowadź polecenie curl, na przykład:

curl --form 'foo=bar' localhost:12345

W pierwszym oknie terminala zobaczysz dokładnie, co curl wysłał w żądaniu.

Teraz oczywiście ncnie wyśle ​​niczego w odpowiedzi (chyba że sam go wpiszesz), więc musisz przerwać polecenie curl (control-c) i powtórzyć proces dla każdego testu.

Jest to jednak przydatna opcja do po prostu debugowania żądania, ponieważ nie bierzesz udziału w podróży w obie strony ani nie produkujesz fałszywych, powtarzalnych żądań, dopóki nie zrobisz tego poprawnie; gdy będziesz zadowolony z polecenia, po prostu przekieruj go na prawidłowy adres URL i możesz zacząć.

Możesz zrobić to samo dla dowolnej biblioteki cURL, po prostu edytuj swoje żądanie, aby wskazywało na lokalnego ncsłuchacza, dopóki nie będziesz zadowolony.

Haravikk
źródło
6

zrzuć nagłówki w jednym pliku, a ładunek odpowiedzi w innym pliku

curl -k -v -u user:pass  "url" --trace-ascii headers.txt >> response.txt
Barry Knapp
źródło
5
curl -s -v -o / dev / null -H „Testheader: test” http://www.example.com

Możesz również użyć -Iopcji, jeśli chcesz wysłać żądanie HEAD, a nie żądanie GET.

juancholas
źródło
3

Oto mój klient HTTP w php, który tworzy zapytania pocztowe z zawartymi plikami cookie:

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
źródło
3

Możesz to zobaczyć za pomocą -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
źródło
1

Możesz użyć wireshark lub tcpdump, aby sprawdzić dowolny ruch sieciowy (również http).

Paweł Polewicz
źródło
11
jeśli ładunek przekracza HTTPS, są one bezużyteczne bez serwera proxy lub monitora warstwy aplikacji.
p00ya
1

Złóż przykładowe żądanie na https://http-tools.appspot.com/reflect-http-request/some-unique-id i sprawdź, co zawiera to żądanie (nagłówek żądania, treść żądania, parametry żądania) za pomocą odpowiedniego adresu URL https : //http-tools.appspot.com/reflect-http-request-finder/some-unique-id . Możesz użyć dowolnego ciągu zamiast some-unique-id, sprawdź https://http-tools.appspot.com, aby uzyskać więcej informacji.

Visruth
źródło
1
Dzięki, choć nie do końca odpowiadam na pytanie, właśnie tego potrzebowałem. Urządzenie A wysyła żądanie, urządzenie B sprawdza, czy żądanie zostało wysłane.
domen