执行 POST 请求的 cURL 命令行语法是什么?

2361 http curl

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

Ste*_*ken 2748

带字段:

curl --data "param1=value1&param2=value2" https://example.com/resource.cgi
Run Code Online (Sandbox Code Playgroud)

单独指定字段:

curl --data "param1=value1" --data "param2=value2" https://example.com/resource.cgi
Run Code Online (Sandbox Code Playgroud)

多部分:

curl --form "fileupload=@my-file.txt" https://example.com/resource.cgi
Run Code Online (Sandbox Code Playgroud)

带有字段和文件名的多部分:

curl --form "fileupload=@my-file.txt;filename=desired-filename.txt" --form param1=value1 --form param2=value2 https://example.com/resource.cgi
Run Code Online (Sandbox Code Playgroud)

没有数据:

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

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

curl --request POST https://example.com/resource.cgi
Run Code Online (Sandbox Code Playgroud)

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

使用 libcurl,curl_formadd()在以通常方式提交表单之前使用该函数构建表单。有关更多信息,请参阅libcurl 文档

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

curl --tr-encoding -X POST -v -# -o output -T filename.dat \
  http://example.com/resource.cgi
Run Code Online (Sandbox Code Playgroud)

-o output是必需的,否则没有进度条就会出现。

  • 你可以使用 `-d` 代替 `--data`。 (11认同)
  • @LauriRanta `--data-urlencode`(没有破折号),至少在最近的版本中 (10认同)
  • 如果您需要使用 PUT 更新资源,也可以使用: curl -X PUT ... (6认同)
  • 我无法理解……我什么时候用“带字段”,什么时候用“多部分”,什么时候用“无数据”来做? (5认同)
  • 我有一个字段数组。我怎样才能做到这一点? (2认同)

sou*_*ter 546

对于包含 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、各种其他 Web 服务(包括 Ruby on Rails)以及数据库(如 CouchDB)的 HTTP API 中找到的 RESTful HTTP API。REST 代表 [Representational state transfer](http://en.wikipedia.org/wiki/REST) (16认同)
  • 我认为您可以省略“-X POST”,因为“-d”暗示了这一点。 (11认同)
  • 我们怎么能看到不是在一行而是格式化的响应xml? (2认同)

Cir*_*郝海东 151

来自标准输入的数据 -d @-

例子:

echo '{"text": "Hello **world**!"}' | curl -d @- https://api.github.com/markdown
Run Code Online (Sandbox Code Playgroud)

输出:

<p>Hello <strong>world</strong>!</p>
Run Code Online (Sandbox Code Playgroud)

  • 如果剪贴板中已经有一个 JSON 对象,那就太好了 (9认同)
  • 更好的是: echo "$message" | curl -H“内容类型:application/json”-d @-“$ url” (2认同)

Pat*_*ins 73

curl -d "name=Rafael%20Sagula&phone=3320780" http://www.where.com/guest.cgi 
Run Code Online (Sandbox Code Playgroud)

是在Curl Example Manual 中找到的示例

如果上述方法不起作用,请使用 %26 作为&符号:

curl -d "name=Rafael%20Sagula%26phone=3320780" http://www.where.com/guest.cgi 
Run Code Online (Sandbox Code Playgroud)


Mar*_*cny 65

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

curl -d "username=admin&password=admin&submit=Login" --dump-header headers http://localhost/Login
curl -L -b headers http://localhost/
Run Code Online (Sandbox Code Playgroud)

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

  • curl 手册页中的注释:“-c, --cookie-jar 选项是存储 cookie 的更好方法。” (8认同)

ccp*_*zza 41

如果你懒惰,你可以让 google-chrome 或 firefox 为你做所有的工作。

  1. 右键单击要提交的表单,然后选择Inspect(或Inspect Element for Firefox)。这将打开 DevTools 面板。
  2. 在 devtools 中选择Network选项卡并勾选 Preserve log复选框(Persist Logs for firefox)。
  3. 提交表单并使用方法 POST 找到条目(右键单击任何列标题并确保选中方法)。
  4. 右键单击带有 POST 的行,然后选择Copy > Copy as cURL

chrome devtools:复制为 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
Run Code Online (Sandbox Code Playgroud)

对于multipart/form-dataPOST 使用-F通常用于包含文件上传的表单,或者字段顺序很重要,或者需要多个具有相同名称的字段):

curl http://httpbin.org/post \
    -H "User-Agent: Mozilla/2.2" \
    -F param1=hello \
    -F name=dinsdale \
    -F name=piranha
Run Code Online (Sandbox Code Playgroud)

User-Agent头通常不需要,但我万一扔了。如果您需要自定义代理,那么您可以通过创建~/.curlrc包含例如User-Agent: "Mozilla/2.2"


Vin*_*vic 37

curl -v --data-ascii var=value http://example.com
Run Code Online (Sandbox Code Playgroud)

还有更多选项,请curl --help查看更多信息。