Как я могу увидеть заголовки запроса, сделанные curl при отправке запроса на сервер?

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 (чтобы не отображать весь контент сайта, только заголовки)
омном
20
curl -Ivs http://example.com > /dev/null: -Iдля HEADзапроса, -vпоказать отправленные заголовки, -sскрыть индикатор выполнения, > /dev/nullпоказать только вывод -v, избегая дублирования.
здесь
@PiotrekDe -D -был аккуратным, но он мне не пригодился, поскольку он просто дублировал заголовки, которые -vуже отображались. Если вы хотите, чтобы они использовались без префикса для автоматического потребления машин, тогда, возможно, было бы лучше в этом случае, но я только хотел бы увидеть, в чем проблема, более подробно.
Пизис
1
Есть два очень полезных свойства флага verbose: во-первых, он также печатает процесс рукопожатия 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подразумевается ли команда командной строки named или вся библиотека 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пустые.
вышла
34
Кто сказал что-нибудь об использованииphp?
Eddie B
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));
Kniganapolke
источник
1
Для меня это был заголовок ответа, а не исходящий заголовок.
Тоби
3
var_dump $dataвернет заголовки ответа, а также тело ответа. Var_dump curl_getinfo($ch)выдаст вам заголовки запроса.
Jrgns
2
CURLOPT_HEADERзаголовок ответа - CURLINFO_HEADER_OUTзаголовок запроса. Это то , что ОП просит :)
Ричард Парнаби-King
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 {имя_файла} или используйте одну черту вместо имени файла, чтобы отправить его на стандартный вывод:

curl --trace-ascii - {URL}

CURLOPT_DEBUGFUNCTION, если вы используете libcurl

Это показывает вам все, что curl отправляет и получает, с добавлением дополнительной информации.

Даниэль Стенберг
источник
1
Это очень многословно, но, безусловно, показывает вам все, что вам нужно знать.
Трипли
27

Я попробовал ответы здесь и обнаружил, что самый полезный и простой из них еще не указан в качестве ответа, но это:

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

Это распечатывает заголовки REQUEST, а также заголовки RESPONSE, а также другие полезные, такие как сертификат SSL и повторное использование существующего TCP-соединения. -vКонечно, этот флаг можно комбинировать с другими флагами, такими как отслеживание перенаправлений и запрос HTTP-аутентификации:

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

Надеюсь это поможет.

GregT
источник
2
Это перечислено в самом верхнем месте
Pmpr
19

Команда, подобная приведенной ниже, покажет три раздела: заголовки запроса, заголовки ответа и данные (разделенные CRLF). Это позволяет избежать технической информации и синтаксического шума, добавляемого скручиванием.

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 - объединить стандартный вывод и стандартный вывод в один стандартный вывод
  • sed - отредактируйте ответ, полученный curl, используя команды ниже
  • /^* /d - удалить строки, начинающиеся с '*' (техническая информация)
  • /bytes data]$/d - удалить строки, заканчивающиеся на «байтовые данные]» (техническая информация)
  • s/> // - удалить префикс '>'
  • s/< // - удалить префикс «<»
igorpcholkin
источник
11

Я знаю, что это немного поздно, но мой любимый способ сделать это - netcatвы получите именно то, что curlотправили; это может отличаться от параметров --traceили --trace-ascii, которые не будут отображать символы не ASCII должным образом (они просто отображаются в виде точек или должны быть декодированы).

Вы можете сделать это очень легко, открыв два окна терминала, в первом типе:

nc -l localhost 12345

Это открывает процесс прослушивания на порту 12345 вашего локального компьютера.

Во втором окне терминала введите команду curl, например:

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

В первом окне терминала вы увидите , что именно curl отправил в запросе.

Теперь, конечно nc, ничего не будет отправлено в ответ (если вы не введете это в себя), поэтому вам нужно будет прервать команду curl (control-c) и повторить процесс для каждого теста.

Тем не менее, это полезный вариант для простой отладки вашего запроса, поскольку вы нигде не задействуете двустороннюю передачу или не производите фиктивные итеративные запросы, пока не сделаете это правильно; когда вы довольны командой, просто перенаправьте ее на действительный URL-адрес, и все готово.

Вы можете сделать то же самое для любой библиотеки cURL, просто отредактировав ваш запрос так, чтобы он указывал на локального ncслушателя, пока вы не будете довольны им.

Haravikk
источник
6

сбросить заголовки в одном файле и полезную нагрузку ответа в другом файле

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

Вы также можете использовать -Iопцию, если вы хотите отправить запрос HEAD, а не запрос GET.

juancholas
источник
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
Yekatandilburg
источник
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 для более подробной информации.

Visruth
источник
1
Спасибо, хотя не совсем отвечаю на вопрос, это именно то, что мне нужно. Устройство A делает запрос, Устройство B проверяет, что запрос был сделан.
Домен