Curl 将管道用于旋度数据

Curl 将管道用于旋度数据,curl,pipe,Curl,Pipe,我试图将cat输出传递给curl: $ cat file | curl --data '{"title":"mytitle","input":"-"}' http://api 但是输入实际上是一种-尝试 curl --data '{"title":"mytitle","input":"'$(cat file)'-"}' http://api 我花了一段时间试图弄明白这一点,并通过以下方式实现了: cat data.json | curl -H "Content-Type: appl

我试图将
cat
输出传递给curl:

$ cat file | curl --data '{"title":"mytitle","input":"-"}' http://api
但是
输入
实际上是一种
-

尝试

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

我花了一段时间试图弄明白这一点,并通过以下方式实现了:

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

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

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

cat data.json | curl-H”内容类型:application/json“-X POST-d”$(这也应该可以

curl -H "Content-Type: application/json" -d @data.json http://api
使用-d强制curl隐式地使用POST进行请求。

如果以字母@开头数据,其余的应该是从中读取数据的文件名,或者-如果要从stdin中读取数据,则可以指定多个文件。从名为“foobar”的文件中过帐数据将使用-d,-data@foobar来完成。当要求从这样的文件中读取数据时,回车和newlin如果您不希望@字符有特殊的解释,请使用--data raw

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

curl-d@data.jsonhttp://api

听起来像是要将
输入的内容包装在一个JSON正文中,然后通过POST请求将其发送过来。我认为最简单的方法是首先操作stdin,然后使用
-d@
将其推到curl上。一种方法可能如下:

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

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

cat | curl-H'内容类型:application/json'http://api -d@-
这会让您进入
cat
,在那里您可以直接输入数据,例如在终端中使用Shift+Insert。最后是换行符和Ctrl+D,这会向
cat
发出完成的信号。然后,该数据会传递到curl,并且您有一个可重用的历史记录条目。

\35;创建输入文件

echo-n'Try我不确定这里是否有特殊格式,否则这可能是您想要的:问题是文件的内容将是JSON数据中
输入的值。我一直忘记
@
符号:(您应该知道,
-d
跳过
\n
\r
字符。这就是为什么我总是使用
--数据二进制
的原因,如果
/dev/stdin
是25MB,比如在我的用例中,我需要上传一个25MB的文件,25MB的base64文本对于bash参数来说太多了?请注意字符串替换,尤其是这可能会微妙地损坏您的数据(例如,去掉尾随的换行符或删除NUL后面的所有内容)。这在bash中非常有效,但在zshYes中读取/dev/stdin:Input/output error
时会产生
错误!非常适合数据大小超过bash参数可以处理的情况。注释“-d@-选项告诉curl从STDIN读取数据。“非常有用。有没有办法删除不属于
文件
的另外两个换行符?刚刚意识到我们可以使用
| tr-d'\n'
删除引入的换行符。