Rails:在API控制器方法之前验证JSON请求格式

时间:2016-12-16 15:34:15

标签: ruby-on-rails json

我已经构建了一个接收JSON的rails API。我想验证请求体是否是有效的JSON,如果没有,则提供API响应的有效错误。花了很多时间尝试不同的选择并试图找到答案但没有成功。

无论我如何尝试捕获错误,当我发送一些不正确的测试JSON时,它总是会抛出以下错误。

JSON::ParserError at /api/v1/apikey123

743: unexpected token at '{
    "query": "hi there" (missing comma here on purpose)
    "lang": "en",
    "sessionId": "en" }
json (2.0.2) lib/json/common.rb, line 156

``` ruby
151     #   additions even if a matching class and create_id was found. This option
152     #   defaults to false.
153     # * *object_class*: Defaults to Hash
154     # * *array_class*: Defaults to Array
155     def parse(source, opts = {})
> 156       Parser.new(source, opts).parse  
157     end
158   
159     # Parse the JSON document _source_ into a Ruby data structure and return it.
160     # The bang version of the parse method defaults to the more dangerous values
161     # for the _opts_ hash, so be sure only to parse trusted _source_ documents.

这是我的代码:

module Api
  class ApiController < ApplicationController
    protect_from_forgery with: :null_session
    before_action :authenticate, :parse_request

    private
    def parse_request
      begin
        @user_input = JSON.parse(request.body.read)
      rescue JSON::ParserError => e
         return false
      end
    end

    ...

  end
end

我想知道如何在不抛出错误的情况下处理此问题,并发回一条带有错误消息的响应&#34;无效的JSON格式&#34;

1 个答案:

答案 0 :(得分:1)

您应该在救援区中调用render方法。操作方法将暂停,因为您致电render

def parse_request
  begin
    @user_input = JSON.parse(request.body.read)
  rescue JSON::ParserError => e
    render json: {error: "Invalid JSON format"}, status: :unprocessable_entity
  end
end