Sinatra内容键入json和form

时间:2014-03-20 07:47:28

标签: json sinatra

我一直在寻找如何正确检查对应用程序/ json类型以及提交的表单的响应。我终于使用以下代码完成了它。有人可以解释它为什么有效吗?或者就更好的解决方案提出建议以达到同样的目的?

post '/login', provides: :json do
p = params
if request.content_type == 'application/json'
  params = JSON.parse(request.body.read, :symbolize_names => true)
else 
  params = p
end


requires(params, :email, :password)

if @user = User.find_by_email(params[:email])
  if @user.authenticate(params[:password])
    log_user_in(@user)
    rabl :login, object: @user
  else
    error 404, {error: "incorrect credentials"}.to_json
  end
else
  error 404, {error: "user not found"}.to_json
end

2 个答案:

答案 0 :(得分:0)

JSON请求是在html请求的主体中提交的,所以这可行,但如果使用RESTful路由,则不建议覆盖params散列。

嘿柯蒂斯。

答案 1 :(得分:0)

只需使用 rack-contrib 中的 ::Rack::JSONBodyParser

<块引用>

一个 Rack 中间件,它使 JSON 编码的请求体在 request.params 哈希。默认情况下,它解析 POST、PATCH 和 PUT 媒体类型为 application/json 的请求。你可以 通过 :verbs 将其配置为匹配任何动词或媒体类型 和 :media 选项。

示例:

  • 仅解析 POST 和 GET 请求

    use Rack::JSONBodyParser, verbs: ['POST', 'GET']

  • 解析内容类型与“json”匹配的 POST|PATCH|PUT 请求

    use Rack::JSONBodyParser, media: /json/

  • 解析 Content-Type 为 'application/json' 或 'application/vnd+json' 的 POST 请求

    use Rack::JSONBodyParser, verbs: ['POST'], media: ['application/json', 'application/vnd.api+json']