在 Rails API 服务中访问未定义的路由时呈现 JSON 格式的响应
render JSON formatted response when accessing undefined routes in Rails API service
情况如下:
如果用户尝试使用未定义的路由访问我的 rails-api 服务,rails 将捕获异常并使用 [=15] 呈现 html =] 到浏览器。
但我希望我的 rails-api 服务执行的是它可以捕获任何类似这样的错误和 return 请求的 json-formatted
错误信息来源,如下所示:
# if i visit a route which is undefined in my config/routes.rb like this:
HTTP.get('http://localhost:3000/api/v1/route/of/undefined')
# what i want it to render to the page is:
{status: 404, err_msg: 'route of undefined, please check again.'}
在我采取行动之前,我发现 Rails 将请求与路由匹配发生在它初始化控制器之前,因此如果我将 rescue_from
添加到我的 ApplicationController
,ApplicationController没有机会挽救异常。
此外,我在我的项目中添加了以下行:
# config/application.rb
config.exceptions_app = self.routes
# config/environments/development.rb
config.consider_all_requests_local = false
接下来我该做什么?我搜索了很多但找不到解决这个问题的答案。尤其是 rails api service
.
如果你想为所有未定义的路由呈现相同的响应,你可以像下面那样做,
match '*path', to: "error_controller#handle_root_not_found", via: [:get, :post]
在 route.rb 末尾添加此行。
之后生成 error_controller
并在那里定义 handle_root_not_found
方法,这将呈现您的自定义响应。
def handle_root_not_found
render json: { message: "route not found"}, status: 404
end
所以在这种情况下会发生什么是当你请求一个特定的路由时,它会从上到下扫描路由文件。
如果找到该路线,那么它会将您重定向到该路线。
如果在 match '*path'
行之前找不到路由,则此行会将其重定向到 handle_root_not_found
方法,该方法将呈现我们的自定义响应。
情况如下:
如果用户尝试使用未定义的路由访问我的 rails-api 服务,rails 将捕获异常并使用 [=15] 呈现 html =] 到浏览器。
但我希望我的 rails-api 服务执行的是它可以捕获任何类似这样的错误和 return 请求的 json-formatted
错误信息来源,如下所示:
# if i visit a route which is undefined in my config/routes.rb like this:
HTTP.get('http://localhost:3000/api/v1/route/of/undefined')
# what i want it to render to the page is:
{status: 404, err_msg: 'route of undefined, please check again.'}
在我采取行动之前,我发现 Rails 将请求与路由匹配发生在它初始化控制器之前,因此如果我将 rescue_from
添加到我的 ApplicationController
,ApplicationController没有机会挽救异常。
此外,我在我的项目中添加了以下行:
# config/application.rb
config.exceptions_app = self.routes
# config/environments/development.rb
config.consider_all_requests_local = false
接下来我该做什么?我搜索了很多但找不到解决这个问题的答案。尤其是 rails api service
.
如果你想为所有未定义的路由呈现相同的响应,你可以像下面那样做,
match '*path', to: "error_controller#handle_root_not_found", via: [:get, :post]
在 route.rb 末尾添加此行。
之后生成 error_controller
并在那里定义 handle_root_not_found
方法,这将呈现您的自定义响应。
def handle_root_not_found
render json: { message: "route not found"}, status: 404
end
所以在这种情况下会发生什么是当你请求一个特定的路由时,它会从上到下扫描路由文件。
如果找到该路线,那么它会将您重定向到该路线。
如果在 match '*path'
行之前找不到路由,则此行会将其重定向到 handle_root_not_found
方法,该方法将呈现我们的自定义响应。