Як я можу побачити заголовки запиту, зроблені завиткою, коли надсилає запит на сервер?


485

Я хочу бачити заголовки запиту, зроблені, curlколи я надсилаю запит на сервер. Як я можу це перевірити?


ця URL-адреса може бути корисною. helloacm.com/curl
doctorlai

1
Ви можете використати це для тестування run-node.com/now-use-curl-with-http-echo-com
Джон Вільямс

Відповіді:


501

Я думаю, що 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
...

58
curl -v -D - stackoverflow.com -o / dev / null (щоб не відображати вміст всього сайту, просто заголовки)
omnomnom

20
curl -Ivs http://example.com > /dev/null: -Iдля HEADзапиту, -vпоказати надіслані заголовки, -sприховати смужку прогресу, > /dev/nullпоказати лише вихід -v, уникаючи дублювання.
тут

@PiotrekDe -D -був акуратним, але мені не був корисний, оскільки він просто дублював заголовки, які -vвже відображалися. Якщо ви хочете, щоб вони були нефіксованими для автоматизованого споживання машини, то, можливо, в цьому випадку це було б краще, але я хотів лише розглянути детальніше про проблему.
Pysis

1
Є дві дуже корисні особливості прапора "багатослівний": спочатку він також друкує процес рукостискання TLS під час доступу до веб-сайту через HTTPS, наприклад curl -v https://www.example.com; по-друге, він також роздруковує CONNECTзапит, якщо ви відвідуєте сайт через HTTP-проксі , наприклад curl --proxy my-proxy:8080 http://www.example.com. Я вважаю, що це допоможе більшості користувачів, якщо в цій відповіді будуть згадані кілька прикладів цих двох функцій.
Франклін Ю

1
TL; DR: Не використовуйте-I в сучасному світі, коли люди запитують про бачення заголовків, вони, ймовірно, говорять про API. І якщо ви використовуватимете -Iменталітет "Я використовую для того, щоб бачити заголовки з моїм веб-сервером Apache", ви збираєтесь витрачати багато часу на розробку HEADметоду, коли ви, ймовірно, хочете використовувати GET. Перестаньте говорити людям користуватися -I. Якщо вони хочуть HEAD, використовуйте -X HEAD(TWSS)
Бруно Броноскі,

141

Питання не визначало, чи 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

Це найкраща відповідь, тому що файл, використаний у цьому методі, містить усе, що вказано нижче у curl_getinfo (), а також більше деталей щодо запиту та відповіді.
Mike_K

3
Ви можете використовувати CURLOPT_WRITEHEADER для інформації заголовка та CURLOPT_FILE для всієї передачі
sturrockad

1
Майте на увазі, що якщо у з’єднанні відмовлено файли, які були вказані CURLOPT_WRITEHEADER та CURLOPT_FILEпорожні.
eithed

34
Хто що сказав про використанняphp?
Едді Б

1
Я відповів на вашу відповідь, оскільки, хоч питання не було пов’язане з PHP, ваша відповідь на основі PHP вказувала мене в правильному напрямку для вирішення моєї власної проблеми з надсиланням маркера носія. Дякую. Свою причину я заявив лише у марній спробі з’явити це запитання у майбутніх пошуках Google у пошуках php-розробників із подібною проблемою.
Кріс

49

Єдиний спосіб, коли мені вдалося побачити свої вихідні заголовки (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));

1
Для мене, що здається, заголовок відповіді, а не вихідний заголовок.
Тобі

3
var_dump $dataповерне заголовки відповідей, а також орган відповіді. Var_dump curl_getinfo($ch)надасть вам заголовки запиту.
Jrgns

2
CURLOPT_HEADERє заголовок відповіді - CURLINFO_HEADER_OUTце заголовок запиту. Про це просить ОП :)
Річард Парнабі-Кінг

44

--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(вона дає кілька сотень рядків виводу, але згадується багато варіантів). Або знайдіть сторінку керівництва, де є більше пояснень, що означають варіанти.


10
-D дає вам заголовки відповідей (як і -I, але для STDIN). Питання задано заголовкам запиту .
pr1001

34

curl --trace-ascii {filename} або використовуйте один тире замість імені файлу, щоб надіслати його в stdout:

curl --trace-ascii - {URL}

CURLOPT_DEBUGFUNCTION, якщо ви використовуєте libcurl

Це показує вам все, що curl надсилає та отримує, із додатковою інформацією.


1
Це дуже багатослівно, але, безумовно, показує все, що вам потрібно знати.
трійка

26

Я спробував відповіді тут і виявив, що найкорисніший і найпростіший ще не вказаний як відповідь, але це:

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

Це роздруковує ЗАЯВКИ заголовки, а також реагування заголовки плюс інші корисні , такі як SSL серт і існуючий TCP з'єднання було повторно чи. -vпрапор можна комбінувати з іншими прапорами, звичайно, такими , як слідувати за переадресації та запрошення для HTTP аутентифікації:

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

Сподіваюсь, це допомагає.


2
Він вказаний на найвищому місці
Pmpr

19

Команда, подібна до наведеної нижче, покаже три розділи: заголовки запитів, заголовки відповідей та дані (розділені 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 в одиночний stdout
  • sed - редагуйте відповідь, отриману завитком, використовуючи команди нижче
  • /^* /d - видалити рядки, починаючи з "*" (технічна інформація)
  • /bytes data]$/d - видалити рядки, що закінчуються на "байтові дані]" (технічна інформація)
  • s/> // - видалити префікс '>'
  • s/< // - видалити префікс '<'

11

Я знаю, що це трохи пізно, але мій прихильний метод зробити це 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слухача, поки ви не будете задоволені цим.


6

скинути заголовки в один файл і корисне навантаження відповіді в іншому файлі

curl -k -v -u user:pass  "url" --trace-ascii headers.txt >> response.txt

5
curl -s -v -o / dev / null -H "Testheader: тест" http://www.example.com

Ви також можете скористатися -Iопцією, якщо потрібно надіслати запит HEAD, а не GET-запит.


3

Ось мій 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

3

Ви можете побачити це за допомогою -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

Ви можете використовувати wireshark або tcpdump, щоб шукати будь-який мережевий трафік (теж http).


11
якщо корисне навантаження перевищує HTTPS, без монітора проксі-сервера або рівня додатків вони марні.
p00ya

1

Зробіть зразок запиту на 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 для отримання більш детальної інформації.


1
Дякую, хоча точно не відповідаю на питання, саме це мені було потрібно. Пристрій A робить запит, пристрій B перевіряє, чи був зроблений запит.
domen
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.