85

我正在尝试将cat输出传递给 curl:

$ cat file | curl --data '{"title":"mytitle","input":"-"}' http://api

input实际上是一个-.

4

8 回答 8

171

我花了一段时间试图弄清楚这一点,并让它与以下内容一起工作:

cat data.json | curl -H "Content-Type: application/json" -X POST --data-binary @- http://api
于 2014-07-31T01:36:19.773 回答
20

您可以使用神奇的标准输入文件/dev/stdin

cat data.json | curl -H "Content-Type: application/json" -X POST -d "$(</dev/stdin)" http://api
于 2016-11-09T02:03:47.717 回答
11

这也应该有效

curl -H "Content-Type: application/json" -d @data.json http://api

使用 -d 强制 curl 隐式使用 POST 请求。

于 2017-04-28T15:38:06.147 回答
10

如果您想在不转义或污染 bash 历史记录的情况下键入/粘贴数据,则可以使用它

cat | curl -H 'Content-Type: application/json' http://api -d @-

这会将您带到cat可以直接输入数据的位置,例如终端中的 Shift + Insert。您以换行符和 Ctrl + D 结束,这cat表明您已完成。然后将该数据传递给 curl,您就有了一个可重用的历史记录条目。

于 2019-07-31T07:51:40.553 回答
9
# Create the input file
echo -n 'Try  and " to verify proper JSON encoding.' > file.txt

# 1. Use jq to read the file into variable named `input` 
# 2. create the desired json
# 3. pipe the result into curl
jq -n --rawfile input file.txt '{"title":"mytitle", $input}' \
| curl -v 'https://httpbin.org/post' -H 'Content-Type: application/json' -d@- 

输出:

  ...
  "json": {
    "input": "Try \ud83d\ude01 and \" to verify proper JSON encoding.", 
    "title": "mytitle"
  }, 
  ...

请注意,输入文件的内容已正确转义以用作 JSON 值。

jq使用的选项:

  • --null-input/-n:
    不要读取任何输入
  • --rawfile variable-name filename
    此选项读入命名文件并将其内容绑定到给定的全局变量。

有关完整详细信息,请参阅jq 手册

-d@-选项告诉 curl 从 STDIN 读取数据。

于 2020-01-11T01:41:16.700 回答
6

尝试

curl --data '{"title":"mytitle","input":"'$(cat file)'-"}' http://api
于 2012-10-10T13:59:21.887 回答
5

-d选项的卷曲文档

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

根据您的 HTTP 端点、服务器配置,您应该可以使用以下格式:

curl -d @data.json http://api

于 2018-02-15T13:31:57.253 回答
1

听起来您想将的内容包装input在 JSON 正文中,然后通过 POST 请求发送。我认为最简单的方法是先操作标准输入,然后使用-d @-. 一种方法可能如下所示:

cat <(echo '{"title":"mytitle","input":"') file <(echo '"}') \
| curl -d @- http://api

我习惯用<(echo)cat来合并字符串和文件,但几乎可以肯定有更好的方法。

请记住,这不会逃避内容,file因此您可能会遇到问题。

于 2019-01-31T07:42:02.760 回答