我一直在寻找如何正确检查对应用程序/ 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
端
答案 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']