如何使用cURL命令行工具发出POST请求?

#1 楼

带有字段:

curl --data "param1=value1&param2=value2" https://example.com/resource.cgi


带有单独指定的字段:

curl --data "param1=value1" --data "param2=value2" https://example.com/resource.cgi


多部分:

curl --form "fileupload=@my-file.txt" https://example.com/resource.cgi


包含字段和文件名的多个部分:

curl --form "fileupload=@my-file.txt;filename=desired-filename.txt" --form param1=value1 --form param2=value2 https://example.com/resource.cgi


没有数据:

curl --data '' https://example.com/resource.cgi

curl -X POST https://example.com/resource.cgi

curl --request POST https://example.com/resource.cgi


有关更多信息,请参见cURL手册。有关模拟Web浏览器的cURL教程很有帮助。

通过libcurl,可使用curl_formadd()函数构建表单,然后再以常规方式提交表单。有关更多信息,请参见libcurl文档。

对于大文件,请考虑添加参数以显示上传进度:

curl --tr-encoding -X POST -v -# -o output -T filename.dat \
  http://example.com/resource.cgi


-o output是必需的,否则将不会显示进度条。

评论


@LauriRanta --data-urlencode(无破折号),至少在最新版本中

–waitinforatrain
13年2月12日在12:34

如果您需要使用PUT更新资源,也可以使用:curl -X PUT ...

– Subfuzion
2014年1月22日下午4:38

我无法理解...什么时候使用字段,何时使用Multipart和何时不使用数据?

–科迪·布格斯坦(CodyBugstein)
2014年9月21日上午11:05

可以使用-d代替--data。

–user35538
2015年10月9日在16:32

我有一个领域的数组。我怎样才能做到这一点?

– ARUNBALAN NV
16 Mar 9 '16 at 13:13

#2 楼

对于包含XML的RESTful HTTP POST:


curl -X POST -d @filename.txt http://example.com/path/to/resource --header "Content-Type:text/xml"


或用于JSON,请使用以下命令:


curl -X POST -d @filename.txt http://example.com/path/to/resource --header "Content-Type:application/json"


这将读取名为filename.txt的文件的内容,并将其作为发布请求发送。

评论


@ tom-wijsman解释:curl -X POST表示一个HTTP POST请求,-d参数(长版本:--data)告诉curl后面将是POST参数,而@filename将文件filename的内容指定为参数。这种方法与Twitter,Facebook,包括Ruby on Rails的各种其他Web服务以及数据库(如CouchDB)的HTTP API一起使用的RESTful HTTP API效果最佳。 REST代表代表性状态转移

– Soundmonster
2012年6月27日上午11:27

我们如何才能看到响应xml不在一行中而是已格式化?

– Vitaly Zdanevich
16年7月29日在13:12

我认为您可以不使用-X POST,因为-d隐含了这一点。

– Benjifisher
16年11月30日在19:02

如何给多个标题?

– keya
17年5月29日在11:37

多个标题:curl -H“ header2:1” -H“ header2:2” ...

–TomášKratochvíla
2017年9月8日14:57在

#3 楼

来自带有-d @-的stdin的数据

示例:

echo '{"text": "Hello **world**!"}' | curl -d @- https://api.github.com/markdown


输出:

<p>Hello <strong>world</strong>!</p>


评论


如果剪贴板中已有JSON对象,那就太好了

–卢卡·斯蒂布(Luca Steeb)
16年5月29日在16:12

更好:echo“ $ message” | curl -H“内容类型:应用程序/ json” -d @-“ $ url”

– rzr
17年11月8日在18:43

#4 楼

curl -d "name=Rafael%20Sagula&phone=3320780" http://www.where.com/guest.cgi 


是《卷曲示例手册》中的示例。

使用%26作为“&”号,尽管如果以上操作无效:

curl -d "name=Rafael%20Sagula%26phone=3320780" http://www.where.com/guest.cgi 


#5 楼

如果要登录到站点,请执行以下操作:

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


第一个请求将会话cookie(成功登录时提供)保存在“标题”中文件。从现在开始,您可以使用该cookie对通过浏览器登录后通常访问的网站的任何部分进行身份验证。

评论


curl的手册页上的一条注释:“但是-c,--cookie-jar选项是存储cookie的更好方法。”

–maxschlepzig
2013年12月28日15:14

#6 楼

如果您很懒,可以让google-chrome或firefox为您完成所有工作。

右键单击要提交的表单,然后选择“检查”(对于Firefox,则选择“检查元素”)。这将打开DevTools面板。
在devtools中选择Network选项卡,然后选中Preserve log复选框(firefox的Persist Logs)。
提交表单并使用POST方法找到条目(右键单击任何列标题,并确保已选中“方法”。
右键单击带有POST的行,然后选择“复制”>“复制为cURL”。


Chrome会将所有请求数据复制到cURL语法。
Chrome使用--data 'param1=hello&param2=world',您可以通过每个参数使用单个-d-F来提高可读性,具体取决于您要发送的POST请求类型,可以是application/x-www-form-urlencodedmultipart/form-data
这将以application/x-www-form-urlencoded(用于大多数不包含文件上传的表单)的形式发布:

 curl http://httpbin.org/post \
    -H "User-Agent: Mozilla/2.2" \
    -d param1=hello \
    -d name=dinsdale
 

对于multipart/form-data POST,请使用-F(通常用于包含文件上传的表单,或者字段顺序很重要的地方,或者多个字段wi需要相同的名称):
 curl http://httpbin.org/post \
    -H "User-Agent: Mozilla/2.2" \
    -F param1=hello \
    -F name=dinsdale \
    -F name=piranha
 

通常不需要User-Agent标头,但我只是把它扔了进去以防万一。如果您需要自定义代理,则可以通过创建包含以下内容的~/.curlrc文件来避免对每个请求进行设置。 User-Agent: "Mozilla/2.2"

#7 楼

curl -v --data-ascii var=value http://example.com


还有更多选项,请检查curl --help以获取更多信息。