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

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

Ответы [ 14 ]

463 голосов
/ 26 июня 2010

Я думаю 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
...
136 голосов
/ 10 декабря 2010

В вопросе не указано, подразумевается ли команда командной строки с именем 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
47 голосов
/ 26 января 2010

Единственный способ увидеть исходящие заголовки (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));
39 голосов
/ 15 мая 2009

Опция --trace-ascii для curl покажет заголовки запроса, а также заголовки ответа и тело ответа.

Например, команда

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 (выводит пару сотен строк, но упоминает много опций). Или найдите справочную страницу , где есть более подробное объяснение значения опций.

30 голосов
/ 15 мая 2009

curl - trace-ascii {имя_файла} или используйте одну черту вместо имени файла, чтобы отправить его на стандартный вывод:

curl --trace-ascii - {URL}

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

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

27 голосов
/ 27 апреля 2016

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

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

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

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

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

8 голосов
/ 16 января 2019

Команда, подобная приведенной ниже, покажет три раздела: заголовки запроса, заголовки ответа и данные (разделенные 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/< // - удалить префикс '<' </li>
8 голосов
/ 07 декабря 2017

Я знаю, что это немного поздно, но мой любимый способ сделать это - 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 слушателя, пока вы не будете довольны им.

6 голосов
/ 08 августа 2014

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

curl -k -v -u user:pass  "url" --trace-ascii headers.txt >> response.txt
5 голосов
/ 02 сентября 2015
curl -s -v -o/dev/null -H "Testheader: test" http://www.example.com

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...