所以,我意识到two questions已经被问过这个问题,但(不幸的是)我的情况似乎有所不同。
Sinatra README说要对POST数据执行以下操作:
post "/api" do
request.body.rewind # in case someone already read it
data = JSON.parse request.body.read
"Hello #{data['name']}!"
end
当我尝试这个时,我得到:
JSON::ParserError: A JSON text must at least contain two octets!
其他问题涉及数据为零或格式不正确(\"
而不是"
)的情况,但我的情况似乎很好。如果我打开irb和JSON.parse我正在POST的完全相同的字符串,它就可以正常工作。
这是我用于测试的命令:
curl -XPOST http://localhost:5000/endpoint --data '{"foo":"bar","blah":"wat","abcdefghijklmnop":"qrstuvwxyz"}'
我觉得这应该是非常明显的,因为解析POST数据对于网络服务器来说是一件非常基本的事情。显然不是。
修改:如果我致电logger.info Hash[params]
,我会:
{"{\"foo\":\"bar\",\"blah\":\"wat\",\"abcdefghijklmnop\":\"qrstuvwxyz\"}"=>nil, "splat"=>[], "captures"=>["endpoint"], "resource"=>"endpoint"}
...但我不确定是否/如何帮助。
答案 0 :(得分:8)
尝试以下几点:
post "/api" do
request.body.rewind # in case someone already read it
data = JSON.parse (request.body.read || '{"name":"Not Given"}')
"Hello #{data['name']}!"
end