如何使用 cURL POST 文件内容?

Mow*_*zer 32 bash shell shell-script curl

我想要做一个位于 的本地文件HTTP POST内容(作为一个字符串)path/to/my-file.txthttp://example.com/.

例如,我可能想要执行以下操作:

  1. 将文件内容提取my-file.txt为字符串。
  2. URL 编码字符串。
  3. 将编码后的字符串存储为名为 的变量foo

然后做这样的事情:

curl -d "data=foo" http://example.com/
Run Code Online (Sandbox Code Playgroud)

(我实际上并不需要这个foo变量。这只是描述我的问题的一种方便的方式。)

执行此操作需要哪些命令?我需要写一个shell脚本吗?如果是这样,它看起来如何?

Gom*_*dor 38

根据-din的最后一节man curl

如果您以字母开头数据@,则其余部分应该是从中读取数据的文件名,或者 - 如果您希望 curl 从标准输入读取数据。也可以指定多个文件。foobar因此,从名为的文件中发布数据将使用--data @foobar. 当--data被告知从这样的文件中读取时,将删除回车符和换行符。

也就是说,您不必做任何花哨的事情,只需在文件名前加上@.

  • 如果你想要一些有用的 shell 转义(例如,使用 jq 来预处理一些 JSON,请尝试:```curl ... -d @<(jq '{"schema": . | tostring }' myschema.avsc') ``` 用例:将一个 JSON 文档包装成另一个 JSON 文档的字符串以将其传递给 REST API。(Confluent Schema Registry) (2认同)

Pie*_*erz 28

如此相关问题中所述,如果您希望上传的文件没有任何更改(curl 默认为去除回车/换行符),那么您可能需要使用该--data-binary选项:

curl -X POST --data-binary @path/to/my-file.txt http://example.com/
Run Code Online (Sandbox Code Playgroud)


Mow*_*zer 20

明确地说,接受的答案表明:

curl -d "data=@path/to/my-file.txt" http://example.com/
Run Code Online (Sandbox Code Playgroud)

手册参考在这里

另请参阅此 SE 答案答案也适用于 multi-parts