使用管道卷曲数据

时间:2012-09-25 13:25:22

标签: curl pipe

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

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

input字面意思是-

8 个答案:

答案 0 :(得分:65)

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

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

答案 1 :(得分:13)

您可以使用魔法stdin文件/dev/stdin

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

答案 2 :(得分:8)

尝试

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

答案 3 :(得分:7)

# 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 manual

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

答案 4 :(得分:5)

这也应该有用

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

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

答案 5 :(得分:3)

Curl documentation for -d option

  

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

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

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

答案 6 :(得分:2)

如果您要键入/粘贴数据而不逃避或污染您的bash历史记录,那么可以使用此

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

将您带到cat中,您可以在其中直接输入数据,例如Shift +插入终端。您以换行符和Ctrl + D结束,这向cat发出信号,表明您已完成操作。然后将这些数据传递给curl,您将获得一个可重用的历史记录条目。

答案 7 :(得分:0)

听起来像您想要在JSON主体中包装 input的内容,然后通过POST请求将其发送出去。我认为最简单的方法是先操作stdin,然后使用-d @-将其推向卷曲。一种方法可能如下所示:

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

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

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