मेरे पास Grape::API
का एक छोटा प्रोटोटाइप सबक्लास है जो रैक सेवा के रूप में है, और मैं अपने एप्लिकेशन की आंतरिक ऑब्जेक्ट्स को प्रस्तुत करने के लिए Grape::Entity
का उपयोग कर रहा हूं।रूबी अंगूर JSON-over-HTTP एपीआई, कस्टम JSON प्रतिनिधित्व
मुझे Grape::Entity
डीएसएल पसंद है, लेकिन मुझे यह पता लगाने में परेशानी हो रही है कि मुझे डिफ़ॉल्ट JSON प्रतिनिधित्व से परे कैसे जाना चाहिए, जो हमारे उद्देश्यों के लिए बहुत हल्का है। मुझे "जेएसएंड या इसी तरह के प्रारूप" में आउटपुट तैयार करने के लिए कहा गया है: http://labs.omniti.com/labs/jsend
मुझे बिल्कुल यकीन नहीं है कि अंगूर ढांचे के साथ परिवर्तन की प्रकृति सबसे अधिक है (मुझे कम से कम पथ- प्रतिरोध यहाँ)। क्या मुझे एक कस्टम अंगूर फॉर्मेटर बनाना चाहिए (मुझे यह नहीं पता कि यह कैसे करना है), नया रैक मिडलवेयर (I ने SysLog के माध्यम से एपीआई इन्स/आउट लॉग करने के लिए ऐसा किया है - लेकिन प्रारूपण खराब लगता है क्योंकि मुझे पार्स करना होगा कंटेनर स्तर जोड़ने के लिए जेएसओएन से वापस शरीर), या 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
Rackup फाइल "(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
हर मार्ग में
कर सकता है - लेकिन यह है कि बहुत शुष्क प्रतीत नहीं होता। मैं कुछ क्लीनर की तलाश में हूँ, और कम खुला & पेस्ट त्रुटियों कटौती करने के लिए जब इस एपीआई बड़ा और पूरी टीम द्वारा बनाए रखा हो जाता है
अजीब तरह से, जब मैं grape 0.3.2
उपयोग करने की कोशिश { :status => "success", :data => present(thing, :with => ThingPresenter) }
, मैं यह काम करने के लिए नहीं मिल सका । एपीआई ने केवल present
से मूल्य वापस कर दिया - शुरू में मैंने सोचा था कि यहां और भी कुछ चल रहा है।
यदि आप फ़ॉर्मेटर्स को एक अलग फ़ाइल में निकालना चाहते हैं, तो वे कहां जाएंगे, और आप उनका उपयोग कैसे करेंगे? –
@dtmunir - अंगूर में डिफ़ॉल्ट या अपेक्षित संरचनाएं नहीं होती हैं (जैसे रेल के पास), इसलिए सर्वर कोड में उनका उपयोग करने का प्रयास करने से पहले सहायक मॉड्यूल वाले फाइल कहीं भी जा सकती हैं या आपको 'आवश्यकता_संबंधी' प्रदान की जा सकती है। मेरे पास ऐप के शीर्ष पर एक 'आवश्यकता' है, और बदले में मैं अंगूर ऐप के लिए परिभाषित सभी चीजों की आवश्यकता 'की आवश्यकता है। जब मैंने इसे वास्तविक के लिए किया तो मुझे केवल कुछ कस्टम हेल्पर्स की आवश्यकता थी, इसलिए मैंने उन्हें एक फाइल 'helpers.rb' - YMMV में रखा। –