Как отправить заголовок с помощью HTTP-запроса через вызов curl?


1448

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


60
Есть хороший способ научиться использовать curl для http-запросов на примерах. Загрузите новейшую версию Postman, выполните любую конфигурацию http-запроса по своему желанию на уровне пользовательского интерфейса (например, post, put, get .. с заголовками и телом json), а затем нажмите «создать код» и выберите параметр «curl» , Это дает вам эквивалентную командную строку.
Виниций Лима

Ответы:


513

ПОЛУЧИТЬ:

с JSON:

curl -i -H "Accept: application/json" -H "Content-Type: application/json" http://hostname/resource

с XML:

curl -H "Accept: application/xml" -H "Content-Type: application/xml" -X GET http://hostname/resource

ПОСЛЕ:

Для размещения данных:

curl --data "param1=value1&param2=value2" http://hostname/resource

Для загрузки файла:

curl --form "fileupload=@filename.txt" http://hostname/resource

RESTful HTTP Post:

curl -X POST -d @filename http://hostname/resource

Для входа на сайт (авторизация):

curl -d "username=admin&password=admin&submit=Login" --dump-header headers http://localhost/Login
curl -L -b headers http://localhost/

что означает @filename для сообщения RESTful? вы размещаете файл на REST-сервер? это странно для меня
JesseBoyd

6
Для людей, прибывающих позже, которым может быть интересно то же самое ... нотация @ - это способ чтения данных для отправки на сервер из файла, а не встраивание их в запрос curl. Вы не размещаете файл как таковой, вы размещаете содержимое файла как тело вашего запроса POST.
f1dave

Более подробный ответ здесь: stackoverflow.com/questions/14978411/… :)
Amith Koujalgi

1983

man curl:

   -H/--header <header>
          (HTTP)  Extra header to use when getting a web page. You may specify
          any number of extra headers. Note that if you should  add  a  custom
          header that has the same name as one of the internal ones curl would
          use, your externally set header will be used instead of the internal
          one.  This  allows  you  to make even trickier stuff than curl would
          normally do. You should not replace internally set  headers  without
          knowing  perfectly well what you're doing. Remove an internal header
          by giving a replacement without content on the  right  side  of  the
          colon, as in: -H "Host:".

          curl  will  make sure that each header you add/replace get sent with
          the proper end of line marker, you should thus not  add  that  as  a
          part  of the header content: do not add newlines or carriage returns
          they will only mess things up for you.

          See also the -A/--user-agent and -e/--referer options.

          This option can be used multiple times to add/replace/remove  multi-
          ple headers.

Пример:

curl --header "X-MyHeader: 123" www.google.com

Вы можете увидеть запрос, который curl отправил, добавив -vопцию.


74
Если вы хотите отправить несколько заголовков, используйте более одного заголовка - все в порядке, curl будет анализировать каждый заголовок как отдельный. Невозможно разделить заголовки внутри одного параметра --header. пример: curl --header "Принять: javascript" --header "test: hello" -v www.google.com
Hatoru Hansou

2
Если людям нужны примеры, я просто оставлю это здесь: bropages.org
Питер Уэстмакотт

man-страницы (по крайней мере, в OSX) теперь содержат пример: Пример: # curl -H "X-First-Name: Joe" 192.168.0.1
JESii

6
@MartinKonicek и другие: я НАСТОЯТЕЛЬНО рекомендую утилиту tldr (brew, etc, install tldr). Это только примеры. например, "- Отправить запрос с дополнительным заголовком, используя собственный метод HTTP: curl -H 'X-My-Header: 123' -X PUT example.com "

280

В PHP :

curl_setopt($ch, CURLOPT_HTTPHEADER, array('HeaderName:HeaderValue'));

или вы можете установить несколько:

curl_setopt($ch, CURLOPT_HTTPHEADER, array('HeaderName:HeaderValue', 'HeaderName2:HeaderValue2'));

1
@James в некоторых случаях работает нормально, но в других CURL отправляет дополнительный заголовок «Expect: 100-continue» - есть идеи, как его удалить?
coding_idiot

@coding_idiot: Вы можете передать «Expect:» в массив значений заголовков, чтобы отключить его. Пример: curl_setopt ($ ch, CURLOPT_HTTPHEADER, массив ('HeaderName: HeaderValue', 'Expect:'));
эфир

12
ОП ничего не сказал о мысли PHP
hanshenrik

Имя заголовка в верхнем регистре с подчеркиванием, а HTTP_ имеет префикс. Например, «токен защиты» становится «HTTP_PROTECTION_TOKEN».
Бимал

54

Использование -H or --header.

Страница руководства : http://curl.haxx.se/docs/manpage.html#-H


10
Параметр -H можно использовать в командной строке, например: curl -H "pwd: 123" localhost / test.php
shasi kanth

Спасибо. Коротко, кратко и покрыто ссылкой на док. Однако ссылка уже устарела, теперь новая - curl.haxx.se/docs/manpage.html#-H
Алексей Кислицын,

44

GET (несколько параметров):

curl -X  GET "http://localhost:3000/action?result1=gh&result2=ghk"

или

curl --request  GET "http://localhost:3000/action?result1=gh&result2=ghk"

или

curl  "http://localhost:3000/action?result1=gh&result2=ghk"

или

curl -i -H "Application/json" -H "Content-type: application/json"  "http://localhost:3000/action?result1=gh&result2=ghk"

1
Спасибо. Я не понял обязательные кавычки для этого вида URL.
remat_br

12

Я использую Почтальон.

Выполните любой вызов, который вы хотите сделать. Затем почтальон предоставляет удобный инструмент для отображения кода скручивания.

Запустите его в терминале. введите описание изображения здесь

введите описание изображения здесь


Это хороший хак, чтобы ускорить процесс, но будьте осторожны, избегая одинарных или двойных кавычек, если вы используете сценарий оболочки в Windows, так как сценарий оболочки имеет свои собственные требования к форматированию
Тьерридев

Хотя почтальон - хороший инструмент, но когда у вас нет графического окружения, как в куберских кубиках, это бесполезно. Учитесь завиваться, и вы всегда можете проверить отдых.
Namphibian

11

Вы также можете отправить несколько заголовков, данных (например, JSON) и указать метод Call (POST, GET) в один вызов CUrl, например:

curl -X POST(Get or whatever) \
  http://your_url.com/api/endpoint \
  -H 'Content-Type: application/json' \
  -H 'header-element1: header-data1' \
  -H 'header-element2: header-data2' \

...... больше заголовков ................

  -d '{
  "JsonExArray": [
    {
      "json_prop": "1",
    },
    {
      "json_prop": "2",
    }
  ]
}'


7

Если вы хотите отправить свои пользовательские заголовки , вы можете сделать это следующим образом:

curl -v -H @{'custom_header'='custom_header_value'} http://localhost:3000/action?result1=gh&result2=ghk

2

В среде anaconda через windows команды должны быть: GET, например:

curl.exe http://127.0.0.1:5000/books 

Разместите или исправьте данные, например:

curl.exe http://127.0.0.1:5000/books/8 -X PATCH -H "Content-Type: application/json" -d '{\"rating\":\"2\"}' 

PS: добавьте обратную косую черту для данных JSON, чтобы избежать ошибок этого типа => Failed to decode JSON object: Expecting value: line 1 column 1 (char 0)

и используйте curl.exeвместо того, curlчтобы избежать этой проблемы:

Invoke-WebRequest : Cannot bind parameter 'Headers'. Cannot convert the "Content-Type: application/json" value of type
"System.String" to type "System.Collections.IDictionary".
At line:1 char:48
+ ... 0.1:5000/books/8 -X PATCH -H "Content-Type: application/json" -d '{\" ...
+                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Invoke-WebRequest], ParameterBindingException
    + FullyQualifiedErrorId : CannotConvertArgumentNoMessage,Microsoft.PowerShell.Commands.InvokeWebRequestCommand
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.