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

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

Ответ 1

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

Ответ 2

Вопрос не указывал, была ли указана команда командной строки с именем 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

Ответ 3

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

Ответ 4

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

Ответ 5

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

curl --trace-ascii - {URL}

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

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

Ответ 6

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

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

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

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

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

Ответ 7

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

Ответ 8

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

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

Ответ 9

curl -s -v -o/dev/null -H "Testheader: test" http://www.example.com

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

Ответ 10

Вот мой http-клиент в php для создания почтовых запросов с включенными кукисами:

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

Ответ 11

Вы можете увидеть его, используя -iv

$> curl  -ivH "apikey:ad9ff3d36888957" --form  "[email protected]/home/mar/workspace/images/8.jpg" --form "language=eng" --form "isOverlayRequired=true" https://api.ocr.space/Parse/Image

Ответ 12

Вы можете использовать wireshark или tcpdump посмотреть любой сетевой трафик (http тоже).

Ответ 13

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

Ответ 14

Команда, подобная приведенной ниже, покажет три раздела: заголовки запроса, заголовки ответа и данные (разделенные 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="#" onclick="location.href='https://stackoverflow.com/'; return false;">here</a></body>

Описание:

  • -vs - добавить заголовки (-v), но удалить индикатор выполнения (-s)
  • 2>&1 - объединить стандартный вывод и стандартный вывод в один стандартный вывод
  • sed - отредактируйте ответ, созданный curl, используя команды ниже
  • /^*/d - удалить строки, начинающиеся с '*' (техническая информация)
  • /bytes data]$/d - удалить строки, заканчивающиеся на "байтовые данные]" (техническая информация)
  • s/>// - удалить префикс '>'
  • s/<// - удалить префикс '<'