Як надіслати заголовок за допомогою HTTP-запиту через виклик curl?


1443

Я хочу надіслати заголовок на мій сервер Apache на вікні Linux. Як я можу досягти цього за допомогою завитка?


60
Існує хороший спосіб навчитися використовувати curl для запитів http на прикладах. Завантажте найновішу версію Поштальона, зробіть будь-яку конфігурацію запиту http на бажаному рівні на рівні інтерфейсу користувача (опублікуйте, поставте, отримайте .. наприклад, із заголовками та тілом json), а потім натисніть на «генерувати код» та виберіть варіант «завити». . Це дає вам еквівалентний командний рядок.
Вініцій Ліма

Відповіді:


508

Отримати:

з 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

POST:

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

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

Для входу на сайт (auth):

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
Для людей, які приїжджають пізніше, яким може бути цікаво те саме ... @ notation - це спосіб зчитування даних, що надсилаються на сервер з файлу, а не вбудований в запит на згортання. Ви не розміщуєте файл сам по собі, ви розміщуєте вміст файлу як тіло запиту POST.
f1dave

Більш докладну відповідь тут: stackoverflow.com/questions/14978411 / ... :)
Amith Koujalgi

1982

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

Ви можете побачити запит, який згорнув, додавши -vпараметр.


74
Якщо ви хочете надіслати декілька заголовків, використовуйте більше одного заголовка, це нормально, curl розбере кожен як інший заголовок. Немає можливості розділити заголовки всередині одного і того ж параметра --header. приклад: curl --header "Прийняти: javascript" --header "тест: привіт" -v www.google.com
Hatoru Hansou

1
Якщо люди хочуть прикладів, я просто залишу це: bropages.org
Пітер Вестмакотт

Сторінки man (на принаймні OSX) тепер DO включають приклад: Приклад: # curl -H "X-Прізвище: Joe" 192.168.0.1
JESii

6
@MartinKonicek та інші: Я настійно рекомендую tldr utiltiy (варити та ін. Встановити 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 надсилає додатковий заголовок "Очікуйте: 100 - продовжуйте" - будь-яка ідея, як його видалити?
coding_idiot

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

12
ОП нічого не сказав про думку PHP
hanshenrik

Ім'я заголовка у верхньому регістрі з підкресленнями, а HTTP_ з префіксом. Наприклад, "маркер захисту" стає "HTTP_PROTECTION_TOKEN".
Bimal Poudel

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

Я використовую Postman.

Виконайте будь-який дзвінок, який ви хочете зробити. Потім, листоноша надає зручний інструмент для відображення коду завивки.

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

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


Це хороший хакер для прискорення роботи, але будьте обережні, щоб уникнути одинарних або подвійних лапок, якщо ви використовуєте скрипт оболонки на Windows, оскільки скрипт оболонки має власні вимоги до форматування
Thierrydev

Хоча листоноша хороший інструмент, але коли у вас немає графічного середовища, як у стручках Kubernetes, він марний. Вчіться завиватися, і ви завжди можете перевірити відпочинок.
Намфібій

11

Ви також можете надіслати кілька заголовків, даних (наприклад, JSON) та вказати спосіб виклику (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

У середовищі анаконди через 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.