Я хочу увидеть заголовки запроса, сделанные 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
подразумевается ли команда командной строки 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
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 {имя_файла} или используйте одну черту вместо имени файла, чтобы отправить его на стандартный вывод:
curl --trace-ascii - {URL}
CURLOPT_DEBUGFUNCTION, если вы используете libcurl
Это показывает вам все, что curl отправляет и получает, с добавлением дополнительной информации.
Я попробовал ответы здесь и обнаружил, что самый полезный и простой из них еще не указан в качестве ответа, но это:
curl -v https://example.com/path
Это распечатывает заголовки REQUEST, а также заголовки RESPONSE, а также другие полезные, такие как сертификат SSL и повторное использование существующего TCP-соединения. -v
Конечно, этот флаг можно комбинировать с другими флагами, такими как отслеживание перенаправлений и запрос HTTP-аутентификации:
curl -vL --user my_username https://example.com/path
Надеюсь это поможет.
Команда, подобная приведенной ниже, покажет три раздела: заголовки запроса, заголовки ответа и данные (разделенные 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/< //
- удалить префикс «<»Я знаю, что это немного поздно, но мой любимый способ сделать это - 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
слушателя, пока вы не будете довольны им.
сбросить заголовки в одном файле и полезную нагрузку ответа в другом файле
curl -k -v -u user:pass "url" --trace-ascii headers.txt >> response.txt
curl -s -v -o / dev / null -H "Testheader: test" http://www.example.com
Вы также можете использовать -I
опцию, если вы хотите отправить запрос HEAD, а не запрос GET.
Вот мой 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 для более подробной информации.