दूरदर्शितापूर्ण परिवर्तनों के लिए REST एंडपॉइंट्स नियोजन के लिए एक अनुशंसित पैटर्न क्या है


25

परिवर्तन के लिए दूरदर्शिता के साथ बाहरी अनुप्रयोगों के लिए एक एपीआई डिजाइन करने की कोशिश करना आसान नहीं है, लेकिन थोड़ा सोचा हुआ आगे जीवन को बाद में आसान बना सकता है। मैं एक ऐसी योजना स्थापित करने की कोशिश कर रहा हूं, जो भविष्य में होने वाले बदलावों का समर्थन करेगी, जबकि पूर्व संस्करण संचालकों को पीछे छोड़ते हुए संगत।

इस लेख पर प्राथमिक चिंता यह है कि किसी दिए गए उत्पाद / कंपनी के लिए सभी परिभाषित समापन बिंदुओं के लिए किस पैटर्न का पालन किया जाना चाहिए।

आधार योजना

के आधार URL टेम्पलेट को देखते हुए https://rest.product.com/मैंने यह सुनिश्चित किया है कि सभी सेवाएं /apiसाथ-साथ चलें /authऔर अन्य गैर-शेष आधारित समापन बिंदु जैसे /doc। इसलिए मैं बेस एंडपॉइंट्स को इस प्रकार स्थापित कर सकता हूं:

https://rest.product.com/api/...
https://rest.product.com/auth/login
https://rest.product.com/auth/logout
https://rest.product.com/doc/...

सेवा समापन बिंदु

अब स्वयं समापन बिंदुओं के लिए। चिंता के बारे में POST, GET, DELETEइस लेख का मूल उद्देश्य नहीं है और उन कार्यों के लिए खुद पर चिंता का विषय है।

एंडपॉइंट को नामस्थान और कार्यों में विभाजित किया जा सकता है। प्रत्येक क्रिया को रिटर्न प्रकार या आवश्यक मापदंडों में मूलभूत परिवर्तनों का समर्थन करने के लिए स्वयं को प्रस्तुत करना चाहिए।

एक काल्पनिक चैट सेवा लेना जहां पंजीकृत उपयोगकर्ता संदेश भेज सकते हैं हमारे पास निम्नलिखित समापन बिंदु हो सकते हैं:

https://rest.product.com/api/messages/list/{user}
https://rest.product.com/api/messages/send

अब भविष्य के एपीआई परिवर्तनों के लिए संस्करण समर्थन जोड़ने के लिए जो टूट सकता है। हम या तो के बाद संस्करण हस्ताक्षर जोड़ सकता है /api/या बाद /messages/sendसमापन बिंदु को देखते हुए हम फिर v1 के लिए निम्नलिखित हो सकते हैं।

https://rest.product.com/api/v1/messages/send
https://rest.product.com/api/messages/v1/send

तो मेरा पहला सवाल यह है कि संस्करण पहचानकर्ता के लिए अनुशंसित स्थान क्या है?

नियंत्रक कोड का प्रबंधन

इसलिए अब हमने स्थापित किया है कि हमें पूर्व संस्करणों का समर्थन करने की आवश्यकता है ताकि हम किसी भी तरह से नए संस्करणों में से प्रत्येक के लिए कोड को संभाल सकें, जो समय के साथ घट सकता है। मान लें कि हम जावा में एंडपॉइंट लिख रहे हैं तो हम इसे पैकेज के माध्यम से प्रबंधित कर सकते हैं।

package com.product.messages.v1;
public interface MessageController {
    void send();
    Message[] list();
}

इसका यह फायदा है कि सभी कोड को नामस्थानों के माध्यम से अलग कर दिया गया है, जहां किसी भी परिवर्तन को बदलने का मतलब होगा कि सेवा समापन बिंदु की एक नई प्रतिलिपि। इसका दोष यह है कि सभी कोड को कॉपी करने की जरूरत है और बग फिक्स को नए और पूर्व संस्करणों में लागू करने की आवश्यकता है जिसे प्रत्येक कॉपी के लिए लागू / परीक्षण किया जाना है।

एक और दृष्टिकोण प्रत्येक समापन बिंदु के लिए हैंडलर बनाना है।

package com.product.messages;
public class MessageServiceImpl {
    public void send(String version) {
        getMessageSender(version).send();
    }
    // Assume we have a List of senders in order of newest to oldest.
    private MessageSender getMessageSender(String version) {
        for (MessageSender s : senders) {
            if (s.supportsVersion(version)) {
                return s;
            }
        }
    }
}

यह अब प्रत्येक समापन बिंदु के लिए संस्करण को अलग करता है और बग फिक्स को केवल एक बार लागू करने की आवश्यकता वाले अधिकांश मामलों में संगत करता है, लेकिन इसका मतलब यह है कि हमें इसका समर्थन करने के लिए प्रत्येक व्यक्ति के समापन बिंदु के लिए थोड़ा अधिक काम करने की आवश्यकता है।

तो मेरा दूसरा सवाल है "पूर्व संस्करणों का समर्थन करने के लिए REST सेवा कोड डिजाइन करने का सबसे अच्छा तरीका क्या है।"

जवाबों:


13

तो मेरा दूसरा सवाल है "पूर्व संस्करणों का समर्थन करने के लिए REST सेवा कोड डिजाइन करने का सबसे अच्छा तरीका क्या है।"

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

बेशक, आप शायद वास्तव में ऐसा नहीं करेंगे; इसलिए:

  • अपना एपीआई संस्करण, जैसे आप योजना बना रहे हैं (और यह एपीआई है जो संस्करण है, न कि अलग-अलग तरीकों से), और इसके बारे में बहुत शोर करें। सुनिश्चित करें कि आपके साथी जानते हैं कि एपीआई बदल सकता है, और यह कि उनके अनुप्रयोगों को यह देखने के लिए जांचना चाहिए कि क्या वे नवीनतम संस्करण का उपयोग कर रहे हैं; और जब कोई नया उपलब्ध हो तो उपयोगकर्ताओं को अपग्रेड करने की सलाह दें। दो पुराने संस्करणों का समर्थन करना कठिन है, पांच का समर्थन करना अस्थिर है।
  • हर "रिलीज" के साथ एपीआई संस्करण को अपडेट करने के आग्रह का विरोध करें। नई सुविधाओं को आम तौर पर मौजूदा क्लाइंट को तोड़ने के बिना वर्तमान संस्करण में रोल किया जा सकता है; वे नई सुविधाएँ हैं। आखिरी चीज जो आप चाहते हैं वह क्लाइंट्स के लिए वर्जन नंबर को नजरअंदाज करने के लिए है , क्योंकि यह ज्यादातर वैसे भी बैकवर्ड संगत है। केवल एपीआई संस्करण को अपडेट करें जब आप मौजूदा एपीआई को तोड़े बिना पूरी तरह से आगे नहीं बढ़ सकते।
  • जब एक नया संस्करण बनाने का समय आता है, तो पहले ग्राहक को पिछले संस्करण का बैकवर्ड-कम्पेटिबल कार्यान्वयन होना चाहिए। "रखरखाव एपीआई" को वर्तमान एपीआई पर ही लागू किया जाना चाहिए। इस तरह से आप कई पूर्ण कार्यान्वयनों के निर्माण के लिए हुक पर नहीं हैं; पुराने संस्करणों के लिए केवल वर्तमान संस्करण और कई "गोले" हैं। बैकवर्ड कॉम्पटिबल क्लाइंट के खिलाफ अब अपग्रेड किए गए एपीआई के लिए रिग्रेशन टेस्ट चलाना, नए एपीआई और कम्पैटिबिलिटी लेयर दोनों को टेस्ट करने का एक अच्छा तरीका है।

3

पहला यूआरआई डिज़ाइन विकल्प बेहतर विचार व्यक्त करता है कि आप पूरे एपीआई का संस्करण बना रहे हैं। दूसरे को संदेशों के संस्करण के रूप में व्याख्या की जा सकती है। तो यह बेहतर है IMO:

rest.product.com/api/v1/messages/send

क्लाइंट लाइब्रेरी के लिए, मुझे लगता है कि अलग-अलग जावा पैकेज में दो पूर्ण कार्यान्वयन का उपयोग करना आसान है, उपयोग करना आसान है और बनाए रखना आसान है।

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

http://theamiableapi.com/2011/10/18/api-design-best-practice-plan-for-evolution/

REST API के लिए विशेष रूप से, आपको यह पोस्ट मार्क नॉटिंघम की मददगार लगेगी:

http://www.mnot.net/blog/2011/10/25/web_api_versioning_smackdown


3

एपीआई संस्करण को संभालने के लिए एक और दृष्टिकोण HTTP हेडर में संस्करण का उपयोग करना है। पसंद

POST /messages/list/{user} HTTP/1.1
Host: http://rest.service.com
Content-Type: application/json
API-Version: 1.0      <----- like here
Cache-Control: no-cache

आप शीर्ष लेख को पार्स कर सकते हैं और इसे बैकएंड में उचित रूप से संभाल सकते हैं।

इस दृष्टिकोण के साथ ग्राहकों को URL, बस हेडर को बदलने की आवश्यकता नहीं है। और इससे REST एंडपॉइंट्स को हमेशा साफ करता है।

यदि क्लाइंट में से किसी ने वर्जन हेडर नहीं भेजा है, तो आप 400 - खराब रिक्वेस्ट भेज सकते हैं या आप इसे अपने एपीआई के बैकवर्ड-कम्पेटिबल वर्जन के साथ संभाल सकते हैं ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.