Curlinfo header out: How to view PHP cURL request body (like CURLINFO_HEADER_OUT for headers)
Содержание
Как отображать заголовки запросов с помощью командной строки curl
спросил
Изменено
1 год, 7 месяцев назад
Просмотрено
794k раз
Командная строка curl может отображать заголовок ответа с помощью параметра -D
, но я хочу видеть, какой заголовок запроса он отправляет. Как мне это сделать?
4
Параметр curl -v
или --verbose
показывает, среди прочего, заголовки HTTP-запросов. Вот пример вывода:
$ curl -v http://google.com/ * О подключении() к порту 80 (#0) google.com * Попытка 66.102.7.104... подключена * Подключено к google.com (66.102.7.104), порт 80 (#0) > ПОЛУЧИТЬ/HTTP/1.1 > User-Agent: curl/7.16.4 (i386-apple-darwin9. 0) libcurl/7.16.4 OpenSSL/0.9.7l zlib/1.2.3 > Хост: google.com > Принять: */* > < HTTP/1.1 301 Перемещен навсегда <Расположение: http://www.google.com/ < Тип содержимого: текст/html; кодировка = UTF-8 < Дата: Чт, 15 июля 2010 г., 06:06:52 по Гринвичу < Истекает: сб, 14 августа 2010 г., 06:06:52 по Гринвичу < Cache-Control: public, max-age=2592000 г. < Сервер: gws < Длина содержимого: 219 < X-XSS-защита: 1; режим = блок <301 перемещено 301 перемещено
Документ перемещен здесь. ТЕЛО> * Соединение №0 с хостом google.com осталось нетронутым * Закрытие соединения #0
2
Популярный ответ для отображения заголовков ответа , но OP спросил о заголовках запроса .
curl -s -D - -o /dev/null http://example.com
-
-s
: Не показывать индикатор выполнения -
-D -
: дамп заголовков в файл, но-
отправляет его на стандартный вывод -
-o /dev/null
: игнорировать тело ответа
Это лучше, чем -I
, так как не отправляет Запрос HEAD
, который может дать разные результаты.
Это лучше, чем -v
, потому что вам не нужно так много хаков, чтобы расшифровать его.
8
Я полагаю, что переключатель командной строки, который вы ищете для передачи в curl, это -I
.
Пример использования:
$ curl -I http://heatmiser.counterhack.com/zone-5-15614E3A-CEA7-4A28-A85A-D688CC418287 HTTP/1.1 301 перемещен навсегда Дата: Сб, 29Декабрь 2012 г. 15:22:05 по Гринвичу Сервер: Апач Расположение: http://heatmiser.counterhack.com/zone-5-15614E3A-CEA7-4A28-A85A-D688CC418287/ Тип содержимого: текст/html; кодировка = iso-8859-1
Кроме того, если вы столкнулись с кодом состояния ответа HTTP 301, вы можете также передать переключатель аргумента -L
, чтобы указать curl
следовать перенаправлениям URL-адресов, и, в этом случае, распечатать заголовки всех страниц. (включая перенаправления URL), как показано ниже:
$ curl -I -L http://heatmiser.counterhack. com/zone-5-15614E3A-CEA7-4A28-A85A-D688CC418287 HTTP/1.1 301 перемещен навсегда Дата: Сб, 29декабрь 2012 г., 15:22:13 по Гринвичу Сервер: Апач Расположение: http://heatmiser.counterhack.com/zone-5-15614E3A-CEA7-4A28-A85A-D688CC418287/ Тип содержимого: текст/html; кодировка = iso-8859-1 HTTP/1.1 302 Найдено Дата: суббота, 29 декабря 2012 г., 15:22:13 по Гринвичу Сервер: Апач Set-Cookie: UID=b8c37e33defde51cf91e1e03e51657da Местонахождение: noaccess.php Тип содержимого: текст/html HTTP/1.1 200 ОК Дата: суббота, 29 декабря 2012 г., 15:22:13 по Гринвичу Сервер: Апач Тип содержимого: текст/html
5
Опция verbose удобна, но если вы хотите увидеть все, что делает curl (включая передаваемое тело HTTP, а не только заголовки), я предлагаю использовать одну из следующих опций:
-
-- трассировка-ascii -
# стандартный вывод -
--trace-ascii output_file.txt
# файл
1
Вы получите хороший вывод заголовка с помощью следующей команды:
curl -L -v -s -o /dev/null google. de
-
-L, --location
следовать перенаправлениям -
-v, --verbose
больше вывода, указывает направление -
-s, --silent
не показывать индикатор выполнения -
-o, --output /dev/null
не показывать полученное тело
Или более короткая версия:
curl -Lvso /dev/null google.de
Результат:
* URL перестроен на: google.de/ * Попытка 2a00:1450:4008:802::2003... * Подключен к google.de (2a00:1450:4008:802::2003) порт 80 (#0) > ПОЛУЧИТЬ/HTTP/1.1 > Хост: google.de > Агент пользователя: curl/7.43.0 > Принять: */* > < HTTP/1.1 301 Перемещен навсегда <Местоположение: http://www.google.de/ < Тип содержимого: текст/html; кодировка = UTF-8 < Дата: пятница, 12 августа 2016 г., 15:45:36 по Гринвичу < Истекает: воскресенье, 11 сентября 2016 г., 15:45:36 GMT < Cache-Control: public, max-age=2592000 г. < Сервер: gws < Длина содержимого: 218 < X-XSS-защита: 1; режим = блок < X-Frame-Options: SAMEORIGIN < * Игнорирование тела ответа { [218 байт данных] * Соединение №0 с хостом google. de осталось нетронутым * Выполните еще один запрос на этот URL: 'http://www.google.de/' * Попытка 2a00:1450:4008:800::2003... * Подключен к www.google.de (2a00:1450:4008:800::2003) порт 80 (#1) > ПОЛУЧИТЬ/HTTP/1.1 > Хост: www.google.de > Агент пользователя: curl/7.43.0 > Принять: */* > < HTTP/1.1 200 ОК < Дата: пятница, 12 августа 2016 г., 15:45:36 по Гринвичу < Истекает: -1 < Cache-Control: private, max-age=0 < Тип содержимого: текст/html; кодировка = ISO-8859-1 < P3P: CP="Это не политика P3P! Дополнительную информацию см. на странице https://www.google.com/support/accounts/answer/151657?hl=ru." < Сервер: gws < X-XSS-защита: 1; режим = блок < X-Frame-Options: SAMEORIGIN < Set-Cookie: NID=84=Z0WT_INFoDbf_0FIe_uHqzL9mf3DMSQs0mHyTEDAQOGY2sOrQaKVgN2domEw8frXvo4I3x3QVLqCh440HME3t1-6gNu8R-ArecuaneSURXNxSXYMhW2kBIE8Duty-_w7; expires=сб, 11 февраля 2017 г., 15:45:36 по Гринвичу; путь=/; домен=.google.de; HttpOnly < Допустимые диапазоны: нет < Варьировать: Accept-Encoding < Transfer-Encoding: фрагментировано < { [11080 байт данных] * Соединение №1 с хостом www. google.de осталось нетронутым
Как вы можете видеть, curl
выводит как исходящие, так и входящие заголовки и пропускает данные тела, хотя и сообщает вам, насколько велико тело.
Дополнительно для каждой строки указано направление, чтобы ее было легко прочитать. Я нашел особенно полезным отслеживать длинные цепочки редиректов.
1
Команда, подобная приведенной ниже, покажет три раздела: заголовки запросов, заголовки ответов и данные (разделенные CRLF). Это позволяет избежать технической информации и синтаксического шума, добавляемого curl. 9*/д; /байт данных]$/д; с/> //; с//'
Команда выдаст следующий вывод:
GET / HTTP/1.1 Хост: www.stackoverflow.com Пользовательский агент: curl/7.54.0 Принимать: */* HTTP/1.1 301 перемещен навсегда Тип содержимого: текст/html; кодировка = UTF-8 Расположение: https://stackoverflow.com/ Длина контента: 149 Допустимые диапазоны: байты Дата: среда, 16 января 2019 г. , 20:28:56 по Гринвичу Через: 1.1 лак Соединение: Keep-alive X-Served-By: cache-bma1622-BMA X-кэш: МИСС X-кэш-попаданий: 0 X-таймер: S1547670537.588756,VS0,VE105 Варьировать: Fastly-SSL X-DNS-Prefetch-Control: выключено Set-Cookie: prov=e4b211f7-ae13-dad3-9720-167742a5dff8; домен=.stackoverflow.com; expires=пт, 01 января 2055 г., 00:00:00 по Гринвичу; путь=/; HttpOnlyДокумент перемещен Объект перемещен
Этот документ можно найти здесь
Описание:
-
-vs
— добавить заголовки (-v), но удалить индикатор выполнения (-s) -
2>&1
— объединить стандартный вывод и стандартный вывод в один стандартный вывод 9* /d — удалить строки, начинающиеся с ‘*’ (техническая информация) -
/bytes data]$/d
— удалить строки, оканчивающиеся на ‘bytes data]’ (техническая информация) -
s/> //
— удалить префикс ‘>’ -
s/< //
- удалить префикс '<'
Мне пришлось самому преодолевать эту проблему при отладке веб-приложений. -v
отлично, но слишком многословно , на мой вкус. Это решение (только для bash), которое я придумал: 9*/д')
Это работает, потому что вывод -v
отправляется на стандартный вывод, а не на стандартный вывод. Перенаправив это на подоболочку, мы можем sed
удалить строки, начинающиеся с *
. Поскольку реальный вывод не проходит через подоболочку, он не затрагивается. Использование подоболочки немного неудобно, но это самый простой способ перенаправить stderr на другую команду. (Как я уже отметил, я использую это только для тестирования, поэтому у меня оно работает нормально.)
Если вам нужны дополнительные альтернативы, вы можете попробовать установить современный HTTP-клиент командной строки, такой как httpie, который доступен для большинства операционных систем. Системы с менеджерами пакетов, такими как brew, apt-get, pip, yum и т. д.
например: - Для OSX
варить установить httpie
Затем вы можете использовать его в командной строке с различными параметрами
http GET https://www. google.com
параметр -v для curl слишком подробен в выводе ошибки, который содержит начальные *
(строка состояния) или >
(поле заголовка запроса) или <
(поле заголовка ответа). чтобы получить только поле заголовка запроса:
curl -v -sS www.stackoverflow.com 2>&1 >/dev/null | grep '>' | вырезать -c1-2 --дополнить
, чтобы получить только поле заголовка запроса:
curl -v -sS www.stackoverflow.com 2>&1 >/dev/null | grep '<' | вырезать -c1-2 --дополнить
или выгрузить его в файл /tmp/test.txt
с параметром -D
curl -D /tmp/test.txt -sS www.stackoverflow.com > /dev/null
для того, чтобы отфильтровать вывод -v
, вы должны направить вывод ошибок на терминал, а вывод std в /dev/null, параметр -s запрещает измерение прогресса
grep - фильтровать вывод заголовка curl в подробном режиме
спросил
Изменено
19 дней назад
Просмотрено
8к раз
Использование curl -v . ..
, то есть подробный режим, который выводит заголовки ввода и вывода. Однако эта информация не передается по конвейеру, и я не могу выделить строки, которые мне не нужны.
Как отфильтровать вывод заголовка curl?
- grep
- завиток
1
Вывод заголовка из curl
печатается со стандартной ошибкой. Таким образом, вы должны использовать перенаправление, например, выбирая заголовок Content-Length
:
curl -v google.com 2>&1 | grep -vi длина содержимого
3
Вместо использования curl -v
(подробный режим) лучше сказать curl
, чтобы он выводил заголовки в STDOUT без всех дополнительных действий по отладке и без печати тела ответа. Таким образом, вы можете выполнить grep
только через заголовки ответов, избежать необходимости перенаправления оболочки и знать, что вашей фильтрации не придется понимать и анализировать curl
внутренние отладочные сообщения (которые, вероятно, не считаются частью его API).
Вы можете сделать это, комбинируя параметры -I
(не печатать тело), -X«METHOD»
(метод переопределения) и -s
(без звука, не показывать индикаторы выполнения).
curl -sIXGET https://www.google.com/ | grep -i тип содержимого:
-
-s
указываетcurl
на скрыть индикаторы выполнения . Если опущено иcurl
обнаружит, что он работает в терминале, он будет обходить канал и напрямую обращаться к терминалу, чтобы показать индикаторы выполнения, что часто бесполезно и загромождает терминал. -
-I
предписываетcurl
отключиться от сервера после получения заголовков вместо ожидания тела сообщения. Это полезно, если вы на самом деле, как указано в вашем вопросе, заинтересованы в поиске через только заголовки ответов HTTP . Это также имеет побочный эффект: по умолчанию для метода запроса используется значениеHEAD
, как если бы вы указали-XHEAD
. -
-X «метод»
(например,-XGET
) переопределяет метод. Во многих случаях 9Запрос 0011 HEAD — это то, что вам нужно, потому что стандарт HTTP говорит, чтоHEAD
должен возвращать те же заголовки, что и тот же запросGET
. Однако при отладке сервера или работе с сервером, который не соответствует стандарту, может быть полезно указатьcurl
сделать запросGET
, но отключиться перед чтением тела ответа. Таким образом, вы можете увидеть фактических заголовков , которые сервер отправит в ответ наGET 9.0012
вместо того, чтобы надеяться, что сервер реализован правильно.
3
Зарегистрируйтесь или войдите в систему
Зарегистрируйтесь с помощью Google
Зарегистрироваться через Facebook
Зарегистрируйтесь, используя адрес электронной почты и пароль
Опубликовать как гость
Электронная почта
Требуется, но не отображается
Опубликовать как гость
Электронная почта
Требуется, но не отображается
Нажимая «Опубликовать свой ответ», вы соглашаетесь с нашими условиями обслуживания и подтверждаете, что прочитали и поняли нашу политику конфиденциальности и кодекс поведения.