curl - 从 Sinatra 中的管道 cURL 读取 PUT 数据

标签 curl request sinatra pipe put

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

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

有什么方法可以读取 Sinatra 中的 PUT 正文?如果可能的话,我想避免更改客户端代码。

最佳答案

我认为来自客户端的 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/

关于curl - 从 Sinatra 中的管道 cURL 读取 PUT 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12137274/

相关文章:

curl - 使用new relic的http api,如何关闭uptime监控?

php - cURL 使用 webcal 协议(protocol)的 url

audio - 如何通过api网关将音频文件上传到s3?

ruby - 使用 Sinatra Reloader 的模块化 Sinatra 应用程序?

performance - 为什么我的 sinatra 网站这么慢?

python - 如何将日期时间字段 curl 为 django

php - 如何使用 curl 对巨大的 XML 文件进行 RAW POST - PHP

Laravel Spatie 事件日志 IP 地址自定义

sql - 带 array_to_string 的 Postgresql 请求

ruby - 如何在 Sinatra 中运行 EventMachine 和服务页面?