Есть ли способ использовать GRAPE для перехвата всех исключений в API вместо отображения страницы с ошибкой HTML - PullRequest
0 голосов
/ 10 апреля 2019

Мы используем Grape для предоставления API; API вызывает исключения во многих местах случайным образом из-за недостаточных параметров, nils и т. д. Это приводит к тому, что Rails создает страницу с ошибкой HTML. Есть ли способ контролировать это и обернуть все вызовы, чтобы вместо этого вернуть сообщение об ошибке?

Мы используем

API

gem 'grape', '0.9'
gem 'grape-swagger', '0.8.0'
gem 'grape-swagger-rails'

Например: если в API возникает какая-либо ошибка, она не достигает

rescue ArgumentError => ex
    error! ex.message
rescue Mongoid::Errors::Validations => ex
    error! ex.message

метода API. Нам нужен способ отловить точное сообщение об ошибке, минуя страницу ошибки HTML.

Уже пробовал это

https://code.dblock.org/2011/05/04/grape-trapping-all-exceptions-within-the-api.html

не уверен, куда вводить ApiErrorHandler.

Ожидаемые результаты должны быть "результат: сообщение об ошибке xyz"

Ответы [ 2 ]

1 голос
/ 10 апреля 2019

не уверен, куда вводить ApiErrorHandler

В вашем контроллере Grape:

require 'api_error_handler'

class Api_v1 < Grape::API
  prefix 'api'
  version 'v1'

  use ApiErrorHandler

  ...
end

Пример кода из article вассвязанный


Или вы можете перехватывать исключения в вспомогательном методе.Что-то вроде:

module ActionsHelper
  extend Grape::API::Helpers

  def request_with_error_handling(options = { status: 422 }, &block)
    raise ArgumentError, 'Options are nil' if options.nil?
    raise ArgumentError, 'No block given' unless block_given?

    yield

    rescue Mongoid::Errors::Validations => ex
      error! ex.message
    rescue ArgumentError => ex
      error! ex.message
  end
end

# users as an example
class Users < Grape::API
  namespace :users do
    helpers ActionsHelper

    desc 'Create new user'
    params do
      # user params
    end
    post '/' do
      request_with_error_handling do
        # your user creation logic here
        # any exception would be catched 
        # in request_with_error_handling helper method
      end
    end
  end
end
0 голосов
/ 10 апреля 2019

Я не уверен, будет ли это работать с вашими настройками, но Grape встроил способ делать подобные вещи. Из документации:

class Twitter::API < Grape::API
  rescue_from ArgumentError do |e|
    Rack::Response.new([ "ArgumentError: #{e.message}" ], 500).finish
  end
  rescue_from NotImplementedError do |e|
    Rack::Response.new([ "NotImplementedError: #{e.message}" ], 500).finish
  end
end
...