我有一个小型的原型子类Grape::API作为机架服务,并Grape::Entity用于呈现我的应用程序的内部对象.
我喜欢Grape::EntityDSL,但我很难找到我应该超越默认的JSON表示,这对我们来说太轻了.我被要求以"jsend或类似"格式生成输出:http://labs.omniti.com/labs/jsend
我完全不确定改变的性质与Grape框架最相符(我想在这里采用最小阻力路径).我应该创建一个自定义的Grape格式化程序(我不知道如何做到这一点),新的机架中间件(我这样做是为了通过SysLog记录API输入/输出 - 但格式化似乎很糟糕,因为我需要解析正文从JSON返回以添加容器级别),或者更改Grape::Entity为例如RABL?
示例代码("app.rb")
require "grape"
require "grape-entity"
class Thing
def initialize llama_name
@llama_name = llama_name
end
attr_reader :llama_name
end
class ThingPresenter < Grape::Entity
expose :llama_name
end
class MainService < Grape::API
prefix 'api'
version 'v2'
format :json
rescue_from :all
resource :thing do
get do
thing = Thing.new 'Henry'
present thing, :with => ThingPresenter
end
end
end
Run Code Online (Sandbox Code Playgroud)
Rackup文件("config.ru")
require File.join(File.dirname(__FILE__), "app")
run MainService
Run Code Online (Sandbox Code Playgroud)
我启动它:
rackup -p 8090 …Run Code Online (Sandbox Code Playgroud) 我正在使用Laravel 5处理RESTful应用程序,我正在尝试捕获异常并生成适当的响应.我也在使用tymondesigns/jwt-auth包,所以所有的API响应都是JSend JSON格式.
现在我正试图抓住TokenExpiredException当给定令牌过期时出现的情况.所以我尝试了这个Handler.php:
if($e instanceof TokenExpiredException)
{
return jsend()->error()
->message("Token Expired")
->code(403)
->data([null])
->get();
}
Run Code Online (Sandbox Code Playgroud)
但我仍然无法捕获此异常并返回JSON响应.虽然我可以为其他例外执行此操作,例如:
if ($e instanceof ModelNotFoundException) {
$e = new NotFoundHttpException($e->getMessage(), $e);
return jsend()->error()
->message("404 Model Not Found")
->data([null])
->get();
}
Run Code Online (Sandbox Code Playgroud)
和:
if ($this->isHttpException($e))
{
if($e instanceof NotFoundHttpException)
{
return jsend()->error()
->message("404 Route Not Found")
->data([null])
->get();
}
return $this->renderHttpException($e);
}
Run Code Online (Sandbox Code Playgroud)
如何处理Laravel中的其他异常?
根据https://labs.omniti.com/labs/jsend,
这是否可以解释为 4xx 错误(例如 404)应始终返回失败,但 5xx 错误始终对应于错误?