4

所以,我意识到已经就这个主题提出了两个 问题,但是(不幸的是)我的情况似乎有所不同。

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 与我发布的完全相同的字符串,它就可以正常工作。

这是我用于测试的命令:

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"}

...但我不确定这是否/如何帮助。

4

1 回答 1

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
于 2013-04-04T19:35:18.580 回答