使用管道来处理curl数据

问题描述 投票:0回答:8

我正在尝试将

cat
输出传递给curl:

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

但是

input
实际上是一个
-

curl pipe
8个回答
225
投票

我花了一段时间试图解决这个问题,并让它与以下内容一起工作:

cat data.json | curl -H "Content-Type: application/json" -X POST --data-binary @- http://api

29
投票

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

/dev/stdin

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

18
投票

如果你想输入/粘贴数据而不转义或污染你的 bash 历史记录,你可以使用这个:

cat | curl --json @- https://api.example/

--json
选项是在v7.82.0中添加的,所以如果您的版本较旧,请使用此:

cat | curl --header 'Content-Type: application/json' \
    --header 'Accept: application/json' \
    --data @- \
    https://api.example/

这些会让您进入交互式

cat
,您可以直接输入数据,例如在终端中按 Shift + Insert。 您以换行符和 Ctrl + D(传输结束字符)结束,这向
cat
发出信号表示您已完成。 然后,该数据将传递到
curl
,您就有了一个可重用的历史记录条目。


16
投票

这也应该有效

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

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


16
投票
# 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读取数据。


7
投票

Curl

-d
选项的文档

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

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

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


6
投票

尝试

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

3
投票

听起来您想将input的内容

包装
在JSON正文中,然后通过POST请求发送。我认为最简单的方法是首先操作 stdin,然后使用
-d @-
将其推送到curl。一种方法可能如下所示:

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

我正在使用

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

请记住,这不会逃避

file
的内容,并且您可能会因此遇到问题。

© www.soinside.com 2019 - 2024. All rights reserved.