製作 exception handlers
通常 API 請求後,伺服器端這邊可能會有找不到資料或是沒考慮到的狀況而噴 Error
而 grape 也有攔截 Error 的方法
這邊製作一個很常用的 Error 處理方式,然後在 base.rb 入口處 include 檔案,就可以做到 exception 的管理
建立檔案 touch app/api/api_v0/exception_handlers.rb
module ApiV0
module ExceptionHandlers
def self.included(base)
base.instance_eval do
# 只要是 grape validation 沒有過的 Error 都返回自定義狀態碼 1001
rescue_from Grape::Exceptions::ValidationErrors do |e|
rack_response({
error: {
code: 1001,
message: e.message
}
}.to_json, e.status)
end
# 如果因為找不到數據 raise Error, 都返回 404 Not Found
rescue_from ActiveRecord::RecordNotFound do
rack_response({ 'message' => '404 Not found' }.to_json, 404)
end
# 任何不存在的路由都返回 404 Not Found
route :any, '*path' do
error!('404 Not Found', 404)
end
end
end
end
class Error < Grape::Exceptions::Base
attr :code, :text
def initialize(opts={})
@code = opts[:code] || 2000
@text = opts[:text] || ''
@status = opts[:status] || 400
@message = { error: { code: @code, message: @text } }
end
end
class AuthorizationError < Error
def initialize
super code: 2001, text: 'Authorization failed', status: 401
end
end
end
在這隻檔案裡面可以看到, 1001 是自定義的錯誤碼給使用者參考,而 2001 是權限不足的自定義狀態碼
如果要創建更多 Error code,只需要在這隻檔案新增就行。
把 Exception 處理的部分也在 api/api_v0/base.rb
加上吧
module ApiV0
class Base < Grape::API
version 'v0', using: :path
#...
include ApiV0::ExceptionHandlers
#...
end
end
我們試試看打一個不存在的 url 會發生什麼事情?
在瀏覽器輸入 http://localhost:3000/api/v0/cccc
就會拿到我們返回的 "404 Not Found"
{"error":"404 Not Found"}