Sinatra内容类型包括json和表单

Sinatra内容类型包括json和表单,json,sinatra,Json,Sinatra,我一直在寻找如何正确地检查和响应application/json类型以及提交的表单。我终于用下面的代码让它自己工作了。有人能解释一下为什么它有效吗?还是提供更好的解决方案来实现同样的目标 post '/login', provides: :json do p = params if request.content_type == 'application/json' params = JSON.parse(request.body.read, :symbolize_names => t

我一直在寻找如何正确地检查和响应application/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

end

JSON请求在html请求的主体中提交,因此这是可行的,但如果使用RESTful路由,则不建议重写params散列


嘿,柯蒂斯。

只需使用
::Rack::JSONBodyParser
来自:

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

示例:

  • 仅解析POST和GET请求

    使用Rack::JSONBodyParser,动词:['POST','GET']

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

    使用Rack::JSONBodyParser,媒体:/json/

  • 解析内容类型为“application/json”或“application/vnd+json”的POST请求

    使用Rack::JSONBodyParser,动词:['POST'],媒体:['application/json','application/vnd.api+json']