Curl 从Sinatra中的管道旋度读取PUT数据
我正在用Sinatra重写一个小型服务器后端,目前客户端通过cURL调用与之对话,比如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
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”。