3

我正在 Sinatra 中重写一个小型服务器后端,目前客户端通过 cURL 调用(例如echo "foo" | curl -X PUT -T - http://localhost:8090/. 问题是,在我put在 Sinatra 中的方法中request.body.read,即使在我调用它之后,它也始终是空rewind的。此外,params哈希是完全空的。

奇怪的是,如果我这样做curl -X PUT -d 'foo' http://localhost:8090/,它会起作用。request.on('data')此外,在 node.js 中,我可以使用andrequest.on('end')函数很好地阅读它。

有没有办法PUT在 Sinatra 中读取身体?如果可能的话,我想避免更改客户端代码。

4

1 回答 1

10

我认为来自客户端的 curl 命令滥用了-T标志。 -T用于上传文件,而不是发送数据。通常,当您不提供目标文件名时,-T将使用本地文件名进行上传。例如,curl -X PUT -T "bar.txt" http://localhost:8090/将本地文件上传bar.txt到远程位置http://localhost:8090/bar.txt。由于您的客户端代码管道标准输入而不是指定文件,因此不存在本地文件名。而且由于您的客户端代码没有指定任何目标文件名,它将产生未定义的结果。我认为 node.js 接受文件上传的内容作为请求正文中的数据是非标准行为。

您使用标志的第二个示例-d是发送数据的正确方法。我真的认为最好的解决方案是更改客户端代码,但如果您愿意,您仍然可以通过管道传输标准输入。只需使用-d而不是-T,如下所示:

echo "foo" | curl -X PUT -d @- http://localhost:8090/
于 2012-08-27T08:10:16.920 回答