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

Зарегистрируйтесь, используя адрес электронной почты и пароль

Опубликовать как гость

Электронная почта

Требуется, но не отображается

Опубликовать как гость

Электронная почта

Требуется, но не отображается

Нажимая «Опубликовать свой ответ», вы соглашаетесь с нашими условиями обслуживания и подтверждаете, что прочитали и поняли нашу политику конфиденциальности и кодекс поведения.