我已经构建了一个接收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;
答案 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