我有一个Grape::API
作为机架服务的小型原型子类,Grape::Entity
用于展示我的应用程序的内部对象。
我喜欢Grape::Entity
DSL,但我很难找出我应该如何超越默认 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
备份文件(“config.ru”)
require File.join(File.dirname(__FILE__), "app")
run MainService
我启动它:
rackup -p 8090
并称之为:
curl http://127.0.0.1:8090/api/v2/thing
{"llama_name":"Henry"}
我想看到的:
curl http://127.0.0.1:8090/api/v2/thing
{"status":"success","data":{"llama_name":"Henry"}}
显然我可以做类似的事情
resource :thing do
get do
thing = Thing.new 'Henry'
{ :status => "success", :data => present( thing, :with => ThingPresenter ) }
end
end
在每条路线上 - 但这似乎不是很干燥。当这个 API 变得更大并由整个团队维护时,我正在寻找更清洁的东西,并且更不容易出现剪切和粘贴错误
奇怪的是,当我尝试{ :status => "success", :data => present( thing, :with => ThingPresenter ) }
使用时grape 0.3.2
,我无法让它工作。API 只返回了来自的值present
——这里发生的事情比我最初想象的要多。