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


我希望在Linux机器上向我的Apache服务器发送一个标题。如何通过卷曲调用实现此目的?


1065
2017-12-10 16:38


起源


有一种很好的方法可以学习如何通过示例使用curl来处理http请求。下载Postman的最新版本,根据需要在用户界面级别进行任何http请求配置(post,put,get ..例如,使用header和json body),然后单击“生成代码”并选择“curl”选项。它为您提供了等效的命令行。 - Vinicius Lima


答案:


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 选项。


1603
2017-12-10 16:41



遗憾的是,手册页不包含您感兴趣的唯一一行:示例。 - Martin Konicek
@MartinKonicek我希望我可以给你1000次投票。我一直回到这个问题,你的答案一遍又一遍,如果手册页有效,我就不用了! - Henley Chiu
如果你想发送多个标题使用多个--header,没关系,curl会将每个标题分析为不同的标题。无法在同一个--header参数中分隔标头。示例:curl --header“Accept:javascript”--header“test:hello”-v www.google.com - Hatoru Hansou
@MartinKonicek这是我见过的评价最高的评论之一。 - Nigralbus
@MartinKonicek和其他人:我强烈建议使用tldr utiltiy(brew等安装tldr)。它的唯一例子。例如“ - 使用自定义HTTP方法发送带有额外标头的请求:curl -H'X-My-Header:123'-X PUT example.com”;


得到:

使用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帖子:

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/

303
2017-10-07 05:15



RESTful帖子的@filename是什么意思?你是否将文件发布到REST服务器?这对我来说似乎很奇怪 - JesseBoyd
对于后来到达的人可能想知道同样的事情... @符号是一种读取数据从文件发送到服务器的方式,而不是将其内联到curl请求中。您没有自己发布文件,而是将POST文件的内容作为POST请求的主体发布。 - f1dave
这里有更详细的答案: stackoverflow.com/questions/14978411/... :) - Amith Koujalgi


PHP

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

或者您可以设置多个:

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

259
2018-04-03 09:49



@James在某些情况下工作正常,但在其他情况下,CURL会发送一个额外的标题“Expect:100-continue” - 关于如何删除它的任何想法? - coding_idiot
@XCoder:请看 tools.ietf.org/html/rfc2616#section-8.2.3 - hakre
@coding_idiot:你可以在标题值数组中传递“Expect:”来禁用它。例如:curl_setopt($ ch,CURLOPT_HTTPHEADER,array('HeaderName:HeaderValue','Expect:')); - ether
OP没有透露任何有关PHP思想的内容 - hanshenrik
标题名称上部带有下划线,HTTP_带有前缀。例如,“protection-token”变为“HTTP_PROTECTION_TOKEN”。 - Bimal Poudel


使用 -H or --header


46
2017-12-10 16:41



-H选项可以在命令提示符中使用,例如:curl -H“pwd:123” 本地主机/ test.php的 - shasi kanth
谢谢。简短,简洁,并链接到doc。但是这个链接已经过时了,新的链接现在已经过时了 curl.haxx.se/docs/manpage.html#-H - Oleksii Kyslytsyn


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"

39
2017-10-14 09:44



谢谢。我没有意识到这种网址的强制性引用。 - remat_br


我已经从卷曲转为 Httpie;语法如下:

http http://myurl HeaderName:value

7
2017-09-02 20:39





如果你想发送你的 自定义标头,你可以这样做:

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

4
2017-08-09 10:27