2012-09-01 9 views
6

में सुरुचिपूर्ण एपीआई संस्करणिंग इस समय मैं अपने रेल एप्लिकेशन में हमारे आरईएसटी एपीआई के लिए संस्करण लागू कर रहा हूं। क्या इसका कोई तरीका लागू किया जा सकता है ताकि आप केवल नए संस्करणों में नई कार्यक्षमता को परिभाषित कर सकें? उदाहरण के लिए कहें:रेल

मेरे पास एक उपयोगकर्ता नियंत्रक और उत्पाद नियंत्रक है। वी 1 और वी 2 के बीच उत्पाद वही रहे हैं, लेकिन उपयोगकर्ता बदल गए हैं। यह अच्छा होगा अगर हम इसे सेट अप कर सकें ताकि अगर मैं उत्पादों के वी 2 के लिए कॉल करूँ, तो मेरा आवेदन जानता है कि यह अस्तित्व में नहीं है और इसके बजाय सबसे हालिया नियंत्रक संस्करण का उपयोग करता है (इस मामले में, वी 1)। यह हमें हर संस्करण के लिए नियंत्रकों का एक नया सेट बनाने की अनुमति नहीं देगा; हम केवल उस विशिष्ट कार्यक्षमता के लिए नए नियंत्रक बनाएंगे जो बदल गए हैं।

नीचे हमारे रूट्स.आरबी से एक स्निपेट है, और स्वीकार्य रूप से मुझे नहीं पता कि इस समस्या से कैसे निपटें। किसी भी तरह की सहायता का स्वागत किया जाएगा!

namespace :api do 
    scope module: :v1, constraints: ApiConstraints.new(version: 1) do 
     resources :users 
     resources :products 
    end 
    scope module: :v2, constraints: ApiConstraints.new(version: 2) do 
     resources :users 
    end 
end 

उत्तर

1

क्या आपने पहले से ही Grape देखा है?

मैंने जो एपीआई I पर बनाया है, मैंने बनाया है, जब उनमें से सभी के लिए कुछ बदलता है (प्रमाणीकरण की तरह) मैं उन्हें सभी को एक विशिष्ट संस्करण वाले एपीआई नियंत्रक से प्राप्त करने के लिए मिलता हूं, जैसे Api::V1::BaseController और सामान्य व्यवहार रखें और वहां पर नियंत्रण।

के बाद से एपीआई आमतौर पर भी अभ्यावेदन को बदलने का मतलब बदल रहा है, एक उपकरण है कि आपके लिए अभ्यावेदन उत्पन्न करता भी वास्तव में महत्वपूर्ण है, कई रत्न के रूप में के लिए वहाँ बाहर देखते हैं का उपयोग कर:

+0

त्वरित उत्तर के लिए धन्यवाद! हमारी टीम पहले ही आरएबीएल का उपयोग कर रही है, इसलिए आदर्श रूप से हम अंगूर में उन विचारों का पुन: उपयोग करना चाहते हैं। मैं अभी अंगूर में देख रहा हूं और एक बार मेरे पास एक कार्यान्वयन कार्यान्वयन हो जाने पर मैं इसे उत्तर के रूप में चिह्नित करूंगा। – NSCodeCasts

1

यह वही है Grape करने के लिए बनाया गया है।

इसके अतिरिक्त, आपके पास अपने एपीआई को अपने रूट.आरबी फ़ाइल में घुमाने या config.ru में मैप करने का विकल्प है, रेल स्टैक को छोड़कर और एपीआई के प्रदर्शन में काफी सुधार हुआ है।

2

मैंने कुछ समय के लिए एक ही रणनीति का उपयोग किया है और हाल ही में दृष्टिकोण बदल दिया है - और स्वीकार्य रूप से मैं पक्षपाती हूं क्योंकि मैं VersionCake के साथ हमारे नए दृष्टिकोण के लेखकों में से एक हूं।

यह दृष्टिकोण केवल हमारे पेलोड या विचारों के संस्करण के लिए है, बाद में विचार ग्राहक के बीच अनुबंध हैं और यदि कोई ब्रेकिंग अनुबंध बदलता है, तो संस्करण को बदलने की जरूरत है। VersionCake में, आप संस्करण कर सकते हैं इसलिए की तरह अपने विचार:

app/views/products/show.v1.rabl 
app/views/products/show.v2.rabl 
app/views/users/show.v1.rabl 

कि आपके प्रश्न के आधार पर महत्वपूर्ण है विशिष्ट विशेषता यह है कि VersionCake शान से नवीनतम समर्थित संस्करण के लिए नीचा जाएगा। उपर्युक्त उदाहरण को देखते हुए, क्लाइंट 2 के लिए users/1.json का अनुरोध करने वाले क्लाइंट को users/show.v1.rabl के लिए पेलोड प्राप्त होगा।

यह सब कहा जा रहा है कि इसे एक नया संस्करण दृष्टिकोण अपनाने की आवश्यकता होगी, इसलिए यह सबसे अच्छा जवाब नहीं हो सकता है, लेकिन मुझे लगता है कि यह विचार करने योग्य विकल्प है।

+0

यह दिलचस्प लग रहा है, और क्या मैं पूछ सकता हूं कि क्या आपको कभी भी एक नया नियंत्रक बनाने की आवश्यकता का सामना करना पड़ता है क्योंकि पुराने व्यक्ति के पास बहुत अधिक संस्करण-विशिष्ट स्थितियां हैं? प्रति संस्करण कैश कैसे करें? धन्यवाद। – lulalala

+0

मैंने नियंत्रक में कई संस्करण शाखाएं विकसित की हैं, लेकिन कुछ भी इतना गंभीर नहीं है कि हमें एक नया नियंत्रक बनाने की आवश्यकता है। हम मॉडलों के तरीकों में जितना अधिक संस्करण विशिष्ट तर्क को मजबूर करने की कोशिश करेंगे और कंट्रोलरों को जितना संभव हो उतना शुष्क करने के लिए विचारों में कॉल करेंगे। कैशिंग के लिए, यह निर्भर करता है कि आपका क्या मतलब है। यदि पृष्ठ कैशिंग का उपयोग करना है, तो आपको शायद ईटाग में संस्करण का उपयोग करना चाहिए। – bencode