Я хочу бачити заголовки запиту, зроблені, curl
коли я надсилаю запит на сервер. Як я можу це перевірити?
Я хочу бачити заголовки запиту, зроблені, curl
коли я надсилаю запит на сервер. Як я можу це перевірити?
Відповіді:
Я думаю, що curl -v
це найпростіше. Він виплюне заголовки запиту (рядки з префіксом '>'), не записуючи у файл:
$ 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
для HEAD
запиту, -v
показати надіслані заголовки, -s
приховати смужку прогресу, > /dev/null
показати лише вихід -v, уникаючи дублювання.
-D -
був акуратним, але мені не був корисний, оскільки він просто дублював заголовки, які -v
вже відображалися. Якщо ви хочете, щоб вони були нефіксованими для автоматизованого споживання машини, то, можливо, в цьому випадку це було б краще, але я хотів лише розглянути детальніше про проблему.
curl -v https://www.example.com
; по-друге, він також роздруковує CONNECT
запит, якщо ви відвідуєте сайт через HTTP-проксі , наприклад curl --proxy my-proxy:8080 http://www.example.com
. Я вважаю, що це допоможе більшості користувачів, якщо в цій відповіді будуть згадані кілька прикладів цих двох функцій.
-I
в сучасному світі, коли люди запитують про бачення заголовків, вони, ймовірно, говорять про API. І якщо ви використовуватимете -I
менталітет "Я використовую для того, щоб бачити заголовки з моїм веб-сервером Apache", ви збираєтесь витрачати багато часу на розробку HEAD
методу, коли ви, ймовірно, хочете використовувати GET
. Перестаньте говорити людям користуватися -I
. Якщо вони хочуть HEAD
, використовуйте -X HEAD
(TWSS)
Питання не визначало, чи curl
малася на увазі назва команди командного рядка чи вся бібліотека cURL.
У наведеному нижче коді PHP, використовуючи бібліотеку cURL, використовується перший параметр як метод HTTP (наприклад, "GET", "POST", "OPTIONS") і другий параметр як 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;
Приклад використання:
php curl-test.php OPTIONS https://google.com
Зауважте, що результати майже ідентичні наступному командному рядку
curl -v -s -o - -X OPTIONS https://google.com
CURLOPT_WRITEHEADER
та CURLOPT_FILE
порожні.
php?
Єдиний спосіб, коли мені вдалося побачити свої вихідні заголовки (curl with php), було використовувати наступні параметри:
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLINFO_HEADER_OUT, true);
Отримання інформації про налагодження:
$data = curl_exec($ch);
var_dump($data);
var_dump(curl_getinfo($ch));
var_dump $data
поверне заголовки відповідей, а також орган відповіді. Var_dump curl_getinfo($ch)
надасть вам заголовки запиту.
CURLOPT_HEADER
є заголовок відповіді - CURLINFO_HEADER_OUT
це заголовок запиту. Про це просить ОП :)
--trace-ascii
Варіант завиток покаже заголовки запитів, а також заголовки відповіді і тіло відповіді.
Наприклад, команда
curl --trace-ascii curl.trace http://www.google.com/
створює файл, curl.trace
який починається наступним чином:
== 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:
Він також отримав відповідь (відповідь 302, якщо бути точним, але неактуальним), який був зареєстрований.
Якщо ви хочете зберегти лише заголовки відповідей , скористайтеся --dump-header
опцією:
curl -D file url
curl --dump-header file url
Якщо вам потрібна додаткова інформація про наявні варіанти, скористайтеся curl --help | less
(вона дає кілька сотень рядків виводу, але згадується багато варіантів). Або знайдіть сторінку керівництва, де є більше пояснень, що означають варіанти.
curl --trace-ascii {filename} або використовуйте один тире замість імені файлу, щоб надіслати його в stdout:
curl --trace-ascii - {URL}
CURLOPT_DEBUGFUNCTION, якщо ви використовуєте libcurl
Це показує вам все, що curl надсилає та отримує, із додатковою інформацією.
Я спробував відповіді тут і виявив, що найкорисніший і найпростіший ще не вказаний як відповідь, але це:
curl -v https://example.com/path
Це роздруковує ЗАЯВКИ заголовки, а також реагування заголовки плюс інші корисні , такі як SSL серт і існуючий TCP з'єднання було повторно чи. -v
прапор можна комбінувати з іншими прапорами, звичайно, такими , як слідувати за переадресації та запрошення для HTTP аутентифікації:
curl -vL --user my_username https://example.com/path
Сподіваюсь, це допомагає.
Команда, подібна до наведеної нижче, покаже три розділи: заголовки запитів, заголовки відповідей та дані (розділені CRLF). Це дозволяє уникнути технічної інформації та синтаксичного шуму, доданого curl.
curl -vs www.stackoverflow.com 2>&1 | sed '/^* /d; /bytes data]$/d; s/> //; s/< //'
Команда видасть такий вихід:
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>
Опис:
-vs
- додайте заголовки (-v), але видаліть смужку прогресу (-s)2>&1
- поєднати stdout і stderr в одиночний stdoutsed
- редагуйте відповідь, отриману завитком, використовуючи команди нижче/^* /d
- видалити рядки, починаючи з "*" (технічна інформація)/bytes data]$/d
- видалити рядки, що закінчуються на "байтові дані]" (технічна інформація)s/> //
- видалити префікс '>'s/< //
- видалити префікс '<'Я знаю, що це трохи пізно, але мій прихильний метод зробити це netcat
, як ви отримаєте саме те, що curl
надіслали; це може відрізнятися від параметрів --trace
або --trace-ascii
параметрів, які не відображають належним чином символи, що не належать до ASCII (вони просто відображаються у вигляді крапок або потребують декодування).
Це можна зробити дуже легко, відкривши два вікна терміналу першого типу:
nc -l localhost 12345
Це відкриває процес прослуховування на порту 12345 вашої локальної машини.
У другому вікні терміналу введіть команду curl, наприклад:
curl --form 'foo=bar' localhost:12345
У першому вікні терміналу ви побачите , який саме завиток відправлений у запиті.
Тепер, звісно, nc
нічого не надішле у відповідь (якщо ви не введете його самостійно), тому вам потрібно буде перервати команду curl (control-c) і повторити процес для кожного тесту.
Однак це корисний варіант для простої налагодження вашого запиту, оскільки ви ніде не залучаєте туди-назад або не виробляєте фіктивних ітеративних запитів десь, поки не зрозумієте це; як тільки ви задоволені командою, просто переадресуйте її на дійсну URL-адресу, і ви готові йти.
Ви можете зробити те ж саме для будь-якої бібліотеки CURL, просто відредагуйте свій запит, щоб вказати на місцевого nc
слухача, поки ви не будете задоволені цим.
скинути заголовки в один файл і корисне навантаження відповіді в іншому файлі
curl -k -v -u user:pass "url" --trace-ascii headers.txt >> response.txt
Ось мій http-клієнт у php, щоб здійснювати публікації запитів із файлами 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
Ви можете побачити це за допомогою -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
Зробіть зразок запиту на https://http-tools.appspot.com/reflect-http-request/some-unique-id і перевірте, що містить цей запит (заголовок запиту, тіло запиту, параметри запиту) відповідною URL-адресою пошуку пошуку https : //http-tools.appspot.com/reflect-http-request-finder/some-unique-id . Ви можете використовувати будь-який рядок замість some-unique-id
, перегляньте https://http-tools.appspot.com для отримання більш детальної інформації.