【发布时间】:2012-09-17 00:40:51
【问题描述】:
我正在尝试将 cat 输出传递给 curl:
$ cat file | curl --data '{"title":"mytitle","input":"-"}' http://api
但input 字面意思是-。
【问题讨论】:
-
我不确定这里是否有特殊格式,否则这可能是你想要的:serverfault.com/questions/313599/…
我正在尝试将 cat 输出传递给 curl:
$ cat file | curl --data '{"title":"mytitle","input":"-"}' http://api
但input 字面意思是-。
【问题讨论】:
试试
curl --data '{"title":"mytitle","input":"'$(cat file)'-"}' http://api
【讨论】:
我花了一段时间试图弄清楚这一点并让它与以下内容一起工作:
cat data.json | curl -H "Content-Type: application/json" -X POST --data-binary @- http://api
【讨论】:
input的值。
@ 符号。 :(
-d 会跳过\n 和\r 字符。这就是为什么我总是使用--data-binary
你可以使用神奇的标准输入文件/dev/stdin
cat data.json | curl -H "Content-Type: application/json" -X POST -d "$(</dev/stdin)" http://api
【讨论】:
/dev/stdin 是 25MB,比如在我的用例中,我需要上传一个 25MB 的文件,而 25MB 的 base64 文本对于 bash-arguments 来说太多了,该怎么办?
error when reading /dev/stdin: Input/output error
这也应该有效
curl -H "Content-Type: application/json" -d @data.json http://api
使用 -d 强制 curl 隐式使用 POST 请求。
【讨论】:
Curl documentation for -d option
如果您以字母 @ 开头数据,则其余部分应该是从中读取数据的文件名,或者 - 如果您希望 curl 从 stdin 读取数据。也可以指定多个文件。因此,将使用 -d, --data @foobar 从名为“foobar”的文件发布数据。当 --data 被告知从这样的文件中读取时,将删除回车和换行符。如果您不希望 @ 字符具有特殊解释,请改用 --data-raw。
根据您的 HTTP 端点、服务器配置,您应该可以使用以下格式:
curl -d @data.json http://api
【讨论】:
听起来您想将input 的内容包装到 JSON 正文中,然后通过 POST 请求发送出去。我认为最简单的方法是先操作标准输入,然后使用-d @- 将其推送到 curl。一种方式可能如下所示:
cat <(echo '{"title":"mytitle","input":"') file <(echo '"}') \
| curl -d @- http://api
我正在使用<(echo) 来使用cat 来合并字符串和文件,但几乎可以肯定有更好的方法。
请记住,这不会逃避 file 的内容,因此您可能会遇到问题。
【讨论】:
file 的另外两个换行符?
<your_original_command> |tr -d '\n' 来删除引入的换行符。
如果你想键入/粘贴数据而不转义或污染你的 bash 历史记录,你可以使用这个
cat | curl -H 'Content-Type: application/json' http://api -d @-
这会将您带到cat,您可以在其中直接输入数据,例如Shift + Insert 在您的终端中。您以换行符和 Ctrl + D 结束,它向cat 发出信号,表明您已完成。然后将该数据传递给 curl,您就有了一个可重用的历史记录条目。
【讨论】:
# 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 读取数据。
【讨论】: