使用管道卷曲数据

Jür*_*aul 36 curl pipe

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

$ cat file | curl --data '{"title":"mytitle","input":"-"}' http://api
Run Code Online (Sandbox Code Playgroud)

input实际上是一个-.

Tom*_*itt 86

我花了一些时间试图解决这个问题并使用以下方法:

cat data.json | curl -H "Content-Type: application/json" -X POST -d @- http://api
Run Code Online (Sandbox Code Playgroud)

  • 您应该知道“-d”会跳过“\n”和“\r”字符。这就是为什么我总是使用 `--data-binary` (5认同)
  • 我想你回答了错误的评论. (4认同)
  • 我总是忘记“@”符号。:( (3认同)

小智 12

您可以使用神奇的stdin文件 /dev/stdin

cat data.json | curl -H "Content-Type: application/json" -X POST -d "$(</dev/stdin)" http://api
Run Code Online (Sandbox Code Playgroud)

  • 请注意字符串替换,尤其是对于二进制数据。这可能会巧妙地损坏您的数据(例如,删除尾随换行符或删除 NUL 之后的所有内容)。 (4认同)
  • 如果`/ dev/stdin`是25MB,就像在我的用例中我需要上传一个25MB的文件和25MB的base64文本对于bash-arguments要处理的情况呢? (2认同)

Joe*_*ing 9

这也应该有效

curl -H "Content-Type: application/json" -d @data.json http://api
Run Code Online (Sandbox Code Playgroud)

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


gol*_*mar 8

尝试

curl --data '{"title":"mytitle","input":"'$(cat file)'-"}' http://api
Run Code Online (Sandbox Code Playgroud)


Rob*_*ade 8

# 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@- 
Run Code Online (Sandbox Code Playgroud)

输出:

  ...
  "json": {
    "input": "Try \ud83d\ude01 and \" to verify proper JSON encoding.", 
    "title": "mytitle"
  }, 
  ...
Run Code Online (Sandbox Code Playgroud)

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

jq使用的选项:

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

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

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

  • 注释“-d@- 选项告诉curl 从 STDIN 读取数据。” 非常有帮助。 (3认同)

ric*_*ere 7

-d选项的卷曲文档

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

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

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


Wal*_*alf 7

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

cat | curl -H 'Content-Type: application/json' http://api -d @-
Run Code Online (Sandbox Code Playgroud)

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