如何通过curl调用使用HTTP请求发送标头?


1442

我希望将标头发送到Linux机器上的Apache服务器。如何通过curl调用实现此目标?


60
有一个很好的方法,可以通过示例学习如何将curl用于http请求。下载最新版本的Postman,根据需要在用户界面级别进行任何http请求配置(例如,带有标头和json主体的post,put,get ..),然后单击“ generate code”并选择“ curl”选项。它为您提供了等效的命令行。
Vinicius Lima

Answers:


506

得到:

使用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发布:

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/

RESTful帖子的@filename是什么意思?您是否正在将文件发布到REST服务器?这对我来说似乎很奇怪
JesseBoyd

6
对于后来到达的人们可能会想知道同样的事情……@表示法是一种从文件读取要发送到服务器的数据的方法,而不是将其内联到curl请求中。您本身并不发布文件,而是将文件的内容发布为POST请求的主体。
f1dave

更详细的答案在这里:stackoverflow.com/questions/14978411/… :)
Amith Koujalgi

1981

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选项来查看curl发送的请求。


74
如果要使用多个--header发送多个头,可以,curl会将每个头解析为不同的头。无法在同一--header参数内分隔标题。例如:curl --header“ Accept:javascript” --header“ test:hello” -v www.google.com
Hatoru Hansou 2015年

1
如果人们想要示例,我就将其留在这里:bropages.org
Peter Westmacott

手册页(至少在OSX上)现在包括一个示例:示例:
#curl

6
@MartinKonicek和其他人:我强烈建议您使用tldr实用程序(酿酒,等安装tldr)。它只是一个例子。例如“ –使用自定义HTTP方法发送带有额外标头的请求:curl

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”-关于如何删除它的任何想法?
2013年

@coding_idiot:您可以在标头值数组中传递“期望:”以将其禁用。例如:curl_setopt($ ch,CURLOPT_HTTPHEADER,array('HeaderName:HeaderValue','Expect:'));
以太

12
OP没有
透露

标题名称以大写字母加上下划线,并以HTTP_为前缀。例如,“保护令牌”变为“ HTTP_PROTECTION_TOKEN”。
Bimal Poudel


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
谢谢。我没有意识到这种网址的强制引号。
remat_br

12

我用邮递员。

执行您想执行的任何呼叫。然后,邮递员提供了一个方便的工具来显示卷曲代码。

在终端中运行它。 在此处输入图片说明

在此处输入图片说明


这是一个很好的技巧,可以加快处理速度,但是如果您在Windows上使用shell脚本,
则要

虽然邮递员是一个很好的工具,但是当您没有Kubernetes Pod中的图形化环境时,它就没有用了。学习卷曲,您可以随时测试休息情况。
Namphibian

11

您还可以发送多个标头,数据(例如JSON),并在单个CUrl调用中指定Call方法(POST,GET),如下所示:

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

在通过Windowsanaconda环境中,命令应为: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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.