
Ruby टेम्पलेटिंग प्रणाली JSON और XML APIs उत्पन्न करने के लिए, CVE-2014-4671 के लिए एक सुधार के साथ। यह partials, inheritance, और custom nodes का समर्थन करता है लचीली API प्रतिक्रिया निर्माण के लिए।
RABL (Ruby API Builder Language) एक Rails और Padrino रूबी टेम्पलेटिंग सिस्टम है जो JSON, XML, MessagePack, PList और BSON उत्पन्न करने के लिए है। ActiveRecord की 'to_json' विधि का उपयोग करते समय, मैं API उत्पन्न करने के लिए एक अधिक अभिव्यक्तिशील और शक्तिशाली समाधान चाहता हूँ। यह विशेष रूप से तब सत्य है जब JSON प्रतिनिधित्व जटिल हो या डेटाबेस में परिभाषित सटीक स्कीमा से मेल न खाता हो।
विशेष रूप से, मैं आसानी से निम्नलिखित करना चाहता हूँ:
जिस किसी ने भी JSON प्रतिक्रिया उत्पन्न करने के लिए ActiveRecord में उपयोग की जाने वाली 'to_json' विधि का प्रयास किया है, उसने इस प्रतिबंधात्मक दृष्टिकोण का दर्द महसूस किया है। RABL एक सामान्य टेम्पलेटिंग सिस्टम है जो API प्रतिक्रिया पीढ़ी को पूरी तरह से नए तरीके से संबोधित करके इन समस्याओं को हल करने के लिए बनाया गया है।
RABL मूल रूप से MVC सिद्धांतों का पालन करने के बारे में है, API डेटा प्रस्तुतियों को आपके एप्लिकेशन के view परत पर स्थानांतरित करके। RABL के बारे में सामान्य गलतफहमियों के विवरण के लिए, कृपया RABL को समझना मार्गदर्शिका देखें, जो इस परियोजना के बारे में किसी भी भ्रम को दूर करने में मदद कर सकती है।
v0.8.0 (14 फरवरी 2013 को जारी) multi_json निर्भरता हटाता है और json पार्सर के रूप में Oj (या JSON) पर निर्भर करता है। कोड को सरल बनाता है, एक निर्भरता हटाता है लेकिन आप MultiJson के किसी भी संदर्भ को हटाना चाह सकते हैं।
v0.6.14 (28 जून 2012 को जारी) टेम्पलेट का परीक्षण करने के लिए RSpec के साथ render_views के उपयोग की आवश्यकता है। अन्यथा, नियंत्रक केवल रेंडर कमांड को पास कर देगा जैसे वह ERB टेम्पलेट्स के साथ करता है।
Install RABL as a gem:``` gem install rabl
या अपने Gemfile में जोड़ें:```ruby
# Gemfile
gem 'rabl'
# Also add either `oj` or `yajl-ruby` as the JSON parser
gem 'oj'
और निर्भरता स्थापित करने के लिए bundle install चलाएँ।
यदि आप Rails 2.3.8 (और उससे ऊपर), Rails 3.X या Padrino का उपयोग कर रहे हैं, तो RABL बिना कॉन्फ़िगरेशन के काम करता है।
महत्वपूर्ण: Padrino के साथ, सुनिश्चित करें कि rabl gem आपकी Gemfile में padrino gem के बाद सूचीबद्ध है, अन्यथा Rabl टेम्पलेट इंजन के रूप में ठीक से पंजीकृत नहीं होगा।
Sinatra, या किसी अन्य टिल्ट-आधारित फ्रेमवर्क के साथ, बस पंजीकृत करें:```ruby Rabl.register!
और RABL आरंभ होकर उपयोग के लिए तैयार होगा। Sinatra के साथ उपयोग के लिए, [Sinatra Usage](https://github.com/nesquena/rabl/wiki/Setup-for-Sinatra) गाइड देखें।
## अवलोकन ##
आप RABL का उपयोग किसी भी रूबी ऑब्जेक्ट से JSON और XML आधारित API उत्पन्न करने के लिए कर सकते हैं।
RABL के साथ, डेटा आमतौर पर मुख्य रूप से मॉडल (ORM-agnostic) से लिया जाता है और API आउटपुट का प्रतिनिधित्व एक साधारण रूबी DSL का उपयोग करके एक व्यू टेम्पलेट के भीतर वर्णित किया जाता है। यह आपको अपने डेटा को उस JSON या XML से अलग रखने की अनुमति देता है जिसे आप आउटपुट करना चाहते हैं।
एक बार जब आप RABL स्थापित कर लेते हैं (ऊपर समझाया गया), तो आप एक RABL व्यू टेम्पलेट बना सकते हैं और फिर टेम्पलेट को अपने Sinatra, Padrino या Rails एप्लिकेशन से कंट्रोलर (या रूट) से बहुत आसानी से रेंडर कर सकते हैं। उदाहरण के तौर पर [Padrino](http://padrinorb.com) का उपयोग करते हुए, यह मानते हुए कि आपके पास ब्लॉग पोस्ट से भरा एक `Post` मॉडल है, आप एक रूट बनाकर API प्रतिनिधित्व (JSON और XML दोनों) रेंडर कर सकते हैं:```ruby
# app/app.rb
get "/posts", :provides => [:json, :xml] do
@user = current_user
@posts = Post.order("id DESC")
render "posts/index"
end
फिर हम @posts के API आउटपुट को व्यक्त करने के लिए निम्नलिखित RABL टेम्पलेट बना सकते हैं:```ruby
collection @posts attributes :id, :title, :subject child(:user) { attributes :full_name } node(:read) { |post| post.read_by?(@user) }
जो `http://localhost:3000/posts.json` पर जाने पर निम्नलिखित JSON या XML आउटपुट करेगा```js
[{ "post" :
{
"id" : 5, title: "...", subject: "...",
"user" : { full_name : "..." },
"read" : true
}
}]
यह एक बुनियादी अवलोकन है लेकिन देखने के लिए बहुत कुछ है जैसे कि partials, inheritance, custom nodes, आदि। नीचे RABL के पूरे विवरण पढ़ें।
RABL को काम करने के लिए बहुत कम या बिना किसी कॉन्फ़िगरेशन की आवश्यकता होती है। अधिकांश परिदृश्यों में ऐसा ही होता है, लेकिन आपकी आवश्यकताओं के अनुसार आप अपने एप्लिकेशन में निम्नलिखित वैश्विक कॉन्फ़िगरेशन सेट करना चाह सकते हैं (यह ब्लॉक पूरी तरह से वैकल्पिक है):```ruby
require 'rabl' Rabl.configure do |config|
end
प्रत्येक विकल्प RABL के आउटपुट से संबंधित व्यवहार निर्दिष्ट करता है। यदि `include_json_root` अक्षम किया जाता है तो वह आउटपुट में प्रत्येक मूल वस्तु के लिए रूट नोड को हटा देता है, और `enable_json_callbacks` इनकमिंग अनुरोध में 'callback' पैरामीटर होने पर 'jsonp' शैली कॉलबैक आउटपुट के लिए समर्थन सक्षम करता है।
यदि `include_child_root` को false पर सेट किया जाता है तो प्रतिक्रिया में चाइल्ड ऑब्जेक्ट्स डिफ़ॉल्ट रूप से रूट नोड शामिल नहीं करेंगे। यह आपको अपनी वांछित प्रतिक्रिया संरचना को और अधिक परिष्कृत करने की अनुमति देता है।
यदि `cache_engine` सेट किया गया है, तो आपको इसे `fetch` विधि वाले एक वर्ग को असाइन करना चाहिए। उदाहरण के लिए [डिफ़ॉल्ट इंजन](https://github.com/nesquena/rabl/blob/master/lib/rabl/cache_engine.rb) देखें।
यदि `perform_caching` को `true` पर सेट किया जाता है तो यह कैशिंग करेगा। यदि आप Rails का उपयोग कर रहे हैं तो आप इस विकल्प को अनदेखा कर सकते हैं, यह Rails के `config.action_controller.perform_caching` के समान है।
यदि `cache_sources` को `true` पर सेट किया जाता है, तो बेहतर प्रदर्शन के लिए टेम्पलेट लुकअप कैश किए जाएंगे। कैश को आपके एप्लिकेशन के भीतर `Rabl.reset_source_cache!` चलाकर मैन्युअल रूप से रीसेट किया जा सकता है।
यदि `cache_all_output` को `true` पर सेट किया जाता है, तो प्रत्येक टेम्पलेट जिसमें संग्रह के भाग के रूप में उपयोग किया जाने वाला प्रत्येक व्यक्तिगत टेम्पलेट शामिल है, अलग से कैश किया जाएगा। इसके अतिरिक्त, child, glue और partial के भीतर की कोई भी चीज़ भी अलग से कैश की जाएगी। केवल एकल टेम्पलेट को कैश करने के लिए, नीचे 'Caching' शीर्षक वाला अनुभाग देखें।
यदि `escape_all_output` को `true` पर सेट किया जाता है और ActiveSupport उपलब्ध है, तो विशेषता आउटपुट को [ERB::Util.html_escape](http://corelib.rubyonrails.org/classes/ERB/Util.html) का उपयोग करके एस्केप किया जाएगा। कस्टम नोड्स एस्केप नहीं होंगे, `ERB::Util.h(value)` का उपयोग करें।