Chcę, aby nagłówki żądań były curl
przesyłane do chwili, gdy wysyłam żądanie do serwera. Jak mogę to sprawdzić?
Chcę, aby nagłówki żądań były curl
przesyłane do chwili, gdy wysyłam żądanie do serwera. Jak mogę to sprawdzić?
Odpowiedzi:
Myślę, że curl -v
jest 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
...
curl -Ivs http://example.com > /dev/null
: -I
dla HEAD
żądania, -v
aby wyświetlić wysłane nagłówki, -s
aby ukryć pasek postępu, > /dev/null
aby wyświetlić tylko wyjście -v, unikając powielania.
-D -
był schludny, ale nie był dla mnie przydatny, ponieważ po prostu zduplikował -v
już 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.
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.
-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 -I
mentalności „Używam do wyświetlania nagłówków z moim serwerem Apache”, zmarnujesz dużo czasu na rozwijanie się przeciwko HEAD
metodzie, 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)
Pytanie nie określało, czy curl
chodził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
CURLOPT_WRITEHEADER
i CURLOPT_FILE
są puste.
php?
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));
var_dump $data
zwróci nagłówki odpowiedzi oraz treść odpowiedzi. Var_dump curl_getinfo($ch)
da ci nagłówki żądania.
CURLOPT_HEADER
jest nagłówkiem odpowiedzi - CURLINFO_HEADER_OUT
jest nagłówkiem żądania. O to prosi OP :)
--trace-ascii
Moż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.trace
któ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-header
opcji:
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.
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.
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. -v
znacznik 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.
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 stdoutsed
- 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 „<”Wiem, że to trochę za późno, ale moją ulubioną metodą jest to netcat
, że dostajesz dokładnie to, co curl
wysłano; może to różnić się od opcji --trace
lub, --trace-ascii
któ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 nc
nie 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 nc
słuchacza, dopóki nie będziesz zadowolony.
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
curl -s -v -o / dev / null -H „Testheader: test” http://www.example.com
Możesz również użyć -I
opcji, jeśli chcesz wysłać żądanie HEAD, a nie żądanie GET.
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
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
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.