Curl 从Sinatra中的管道旋度读取PUT数据

Curl 从Sinatra中的管道旋度读取PUT数据,curl,request,sinatra,pipe,put,Curl,Request,Sinatra,Pipe,Put,我正在用Sinatra重写一个小型服务器后端,目前客户端通过cURL调用与之对话,比如echo“foo”| cURL-X PUT-T-http://localhost:8090/。问题是,在我的Sinatra中的put方法中,request.body.read始终是空的,即使我调用了revend。此外,params散列是完全空的 奇怪的是,如果我做curl-X PUT-d'foo'http://localhost:8090/相反,它可以工作。另外,在node.js中,我可以使用request.o

我正在用Sinatra重写一个小型服务器后端,目前客户端通过cURL调用与之对话,比如
echo“foo”| cURL-X PUT-T-http://localhost:8090/
。问题是,在我的Sinatra中的
put
方法中,
request.body.read
始终是空的,即使我调用了
revend
。此外,
params
散列是完全空的

奇怪的是,如果我做
curl-X PUT-d'foo'http://localhost:8090/
相反,它可以工作。另外,在node.js中,我可以使用
request.on('data')
request.on('end')
函数很好地读取它


有没有办法读取Sinatra中的
PUT
正文?我希望尽可能避免更改客户端代码。

我认为客户端的curl命令误用了
-T
标志
-T
用于上载文件,而不是发送数据。通常,当您不提供目标文件名时,
-t
将使用本地文件名进行上载。例如,
curl-xput-T“bar.txt”http://localhost:8090/
将本地文件
bar.txt
上传到远程位置
http://localhost:8090/bar.txt
。由于您的客户机代码使用stdin而不是指定文件,因此不存在本地文件名。由于客户端代码没有指定任何目标文件名,因此将生成未定义的结果。我认为NoDE.js的非标准行为是将文件上传的内容作为请求正文中的数据接受。 使用
-d
标志的第二个示例是发送数据的正确方式。我真的认为最好的解决方案是更改客户机代码,但如果您愿意,仍然可以使用stdin管道。只需使用
-d
而不是
-T
,如下所示:

echo "foo" | curl -X PUT -d @- http://localhost:8090/

您使用的是
request.body
,还是
request.body.read
?后者是读取
POST
请求正文的正确语法。@KyleLacy是的,我使用的是
request.body.read
。更新了问题以使其更清楚。谢谢,这很有效。尽管您必须使用
--data binary
而不是
-d
来按原样上传数据(保留换行符等)。此外,curl手册页在
-T
-上令人困惑-它说您可以使用
-T-
“使用stdin而不是给定的文件”。我想他们的意思是在文件名中插入管道而不是文件内容?是的,手册页有点模糊。我的理解是,
-T-
导致curl接受stdin作为要上载的文件的内容,因此必须指定目标文件。例如:
echo“foo”| curl-X PUT-T-http://localhost:8090/bar
应导致在目的地创建
,内容为“foo”。