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


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
...

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

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));

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.


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.


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.


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 „<”

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.


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

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.


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

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


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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.