我有一个Sinatra应用程序,在我的大多数控制器中,json进入并在params对象中自动拾取.但是,除非我使用before方法来拉取request.body参数将它们解析为JSON并将它们合并到params散列中,否则我的后期操作根本没有得到参数.
这是控制器,以及过滤方法:
before do
if request.request_method == "POST"
body_parameters = request.body.read
params.merge!(JSON.parse(body_parameters))
end
end
post '/locations/new' do
content_type :json
puts "params after post params method = #{params.inspect}"
... other code ...
end
Run Code Online (Sandbox Code Playgroud)
我看到的输出基本上是控制器动作中的参数实际上在那里正确.但是,如果我在通话前注释掉参数是空的.
之前的感觉就像一个黑客.无论怎样,我都希望这些参数进来......我必须在那里做错事但我不知道它是什么.
任何帮助将深深感激......
Kyl*_*acy 33
为了回答这个问题,我们首先要看一些HTTP请求(这些只是简单的telnet'消息';这可以很容易地手工重新创建).首先,当您提交普通HTML时会发生什么<form>?该POST请求将看起来非常相似,这(可能有一些额外的参数,但我们并不需要现在就担心):
POST /submit-form HTTP/1.1
Host: localhost
Content-Type: application/x-www-form-urlencoded
Content-Length: 12
name=JohnDoe
Run Code Online (Sandbox Code Playgroud)
逐个字符地键入(用/sample-form任何表单操作的URL 替换,以及Host用您的IP或主机名替换)将与浏览器发送的内容相同.从中学到的重要一点是参数语法:formname=formvalue.Sinatra 使用这种语法将POST请求的主体解释为params哈希!因此,与此基本不兼容的JSON请求将不会出现在params哈希中,因为这样.
但是,您在before块中执行的操作会显示正确的解决方案.虽然params从上面会是{'name' => 'JohnDoe'},request.body.read将返回原来的身体,name=JohnDoe.
在了解这一点后,人们可以理解为什么你的'hacky'解决方案有效:POST请求的原始主体被解释JSON.parse,然后被插入空params哈希.看起来很丑的原因是因为params这个例子中是一个不必要的中间人.以下应该做的工作:
post '/locations/new' do
@json = JSON.parse(request.body.read)
# @json now contains a hash of the submitted JSON content
end
Run Code Online (Sandbox Code Playgroud)
但是,执行更好实践的解决方案要么仅在提供JSON内容时作出响应,要么在提交标准表单时作出不同响应.如上面的示例HTTP POST请求所示,HTML表单使用application/x-www-form-urlencodedMIME类型标识,而JSON标识为application/json.如果你想要检查POST请求的MIME类型的具体细节,请查看这个问题,并提供一些关于如何使用Sinatra做到这一点的好答案!
goy*_*kit 14
有一个类似的问题: 从Java发布JSON参数到sinatra服务
我找到了一个更好的解决方案来处理它,通过添加一个中间件来为我做同样的事情.我使用了rack-contrib gem.以下是我在代码中所做的更改:
编辑:使用git获取特定版本,在内容类型为的时候修复问题application/json;charset=UTF-8
的Gemfile:
gem 'rack-contrib', git: 'git@github.com:rack/rack-contrib', ref: 'b7237381e412852435d87100a37add67b2cfbb63'
Run Code Online (Sandbox Code Playgroud)
config.ru:
use Rack::PostBodyContentTypeParser
Run Code Online (Sandbox Code Playgroud)
来源:http://jaywiggins.com/2010/03/using-rack-middleware-to-parse-json/
| 归档时间: |
|
| 查看次数: |
15118 次 |
| 最近记录: |