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
-私が最初に思ったよりも多くのことがここで起こっています。