एक वास्तुशिल्प बदलाव का वर्णन कैसे करें जो जानबूझकर REST मानकों को तोड़ता है?


37

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

उदाहरण के लिए, ग्राहक के लिए एक POST एक ग्राहक रिकॉर्ड बनाएगा, जबकि एक PUT उस ग्राहक को संशोधित करेगा। न ज्यादा, न ज्यादा कम। हालाँकि हमारे व्यापारिक तर्क इससे कहीं अधिक मांग वाले हैं। एक ग्राहक बनाने की सामान्य प्रक्रिया 1 डेटाबेस रिकॉर्ड डालने से काफी अधिक है। यह अन्य आवश्यक तालिकाओं में डेटा का प्रावधान करेगा, कुछ मान्यताओं और गणनाओं का प्रदर्शन करेगा, आदि मैं एक एकल पोस्ट / पीयूटी कॉल करना पसंद करूंगा जो इस व्यवहार के सभी को अलग करता है, उपभोग करने वाले ग्राहक के भार को हल्का करता है।

इसलिए मेरा दृष्टिकोण यह है कि यह ओवररचिंग ऑर्केस्ट्रेशन सर्वर पर रहना चाहिए (जहां हमारा पूर्ण नियंत्रण है, लॉग्स इत्यादि), यूआई नहीं, लेकिन एक प्रतिवाद यह है कि यह दृष्टिकोण अब रेस्टफुल नहीं होगा। इसलिए मैं अनिश्चित हूं कि इस तकनीक का सबसे अच्छा वर्णन कैसे किया जाए जब मेरी सिफारिश मौजूदा प्रौद्योगिकी स्टैक के साथ जारी रखने की है, लेकिन उन स्थानों में मौलिक बदलावों को लागू करें जहां कोड हैं।


44
CRUD के लिए अपने एपीआई को सीमित करने के लिए इसे "रेस्टफुल" बनाने के लिए कॉल करना एक खराब व्यापार है।
रॉबर्ट हार्वे

38
@EsbenSkovPedersen: बेस्ट फ्रेंड फॉरएवर?
रॉबर्ट हार्वे

5
इस बारे में चिंता करने के बजाय कि क्या आपकी सेवा REST (iirc, लगभग कोई भी नहीं) के अनुरूप है, मैं HTTP कल्पना के अनुरूप होने के बारे में अधिक चिंता करूँगा । अधिकांश एपीआई के साथ मैंने भी काम किया है, युक्ति के अनुरूप नहीं है, लेकिन यह अधिक प्राप्त करने योग्य और सार्थक लक्ष्य है।
आहा

7
@aaaaaa, REST के अनुरूप लगभग कोई भी सेवा नहीं है इसका कारण यह है कि कोई भी यह तय नहीं कर सकता है कि REST क्या है। समझौते का एकमात्र बिंदु मैंने पाया है "बाकी सभी इसे गलत कर रहे हैं"।
मार्क

16
- "एक वास्तुशिल्प बदलाव का वर्णन कैसे करें जो जानबूझकर REST मानकों को तोड़ता है?" - नापसंद करें । ( एक अव्यवसायिक टिप्पणी के लिए खेद है, यह मुझसे ज्यादा मजबूत था। )
luk32

जवाबों:


49

मैं अनिश्चित हूं कि इस दृष्टिकोण का सबसे अच्छा वर्णन कैसे किया जाए जब मेरी सिफारिश मौजूदा प्रौद्योगिकी स्टैक के साथ जारी रखने की है, लेकिन उन स्थानों में मौलिक बदलावों को लागू करें जहां यह कोड है।

Service oriented architecture

आप अपने सिस्टम को फिर से डिज़ाइन करने का प्रस्ताव कर रहे हैं ताकि आपके व्यावसायिक नियम और आपका डेटा एक ही स्थान पर हों। यह प्रभावी रूप से एक सेवा की परिभाषा है ; देखिए सेवादल की सीमाओं पर उदी दहन की बात ।

साइडबार: एरिक द्वारा नोट किया गया, इसका "रेस्ट" से कोई लेना-देना नहीं है। इस बात का कोई कारण नहीं है कि आप अपनी सेवा के सामने REST API नहीं डाल सकते हैं (जो कहना है, एक API जो REST आर्किटेक्चरल स्टाइल की बाधाओं को संतुष्ट करता है )। लेकिन यह उन लोगों के लिए स्पष्ट नहीं हो सकता है जो रीस्ट को डेटाबेस के संचालन के लिए मैपिंग का मतलब HTTP तरीकों से समझते हैं।

यह आपके दर्शकों की REST की समझ को बदलने में निवेश करने योग्य हो भी सकता है और नहीं भी।


32
न ही यह REST में निवेश करने लायक हो सकता है। यदि आप रॉय फील्डिंग के शोध प्रबंध (या मैंने अपनी पत्नी को कैसे समझाए ) को पढ़ा , तो REST का असली उद्देश्य इंटरनेट पर संसाधनों के लिए एक कैनोनिकल प्रतिनिधित्व प्रदान करना है, ताकि इंटरनेट पर अलग-अलग मशीनों का उन संसाधनों में हेरफेर करने का एक मानक तरीका हो। । निजी स्वामित्व वाली एप्लिकेशन को भी इस क्षमता की आवश्यकता नहीं हो सकती है।
रॉबर्ट हार्वे

29

REST CRUD नहीं है। यह "प्रतिवाद" REST क्या है की एक मौलिक रूप से त्रुटिपूर्ण समझ पर आधारित है। मैंने आपके पोस्ट में ऐसा कुछ भी नहीं देखा है जो आपके परिवर्तन को इंगित करता हो और आपके एपीआई को कम या ज्यादा प्रतिष्ठित बना देगा।


6
खैर, नहीं, यह सीआरयूडी के लिए एक आदर्श मानचित्रण नहीं है, लेकिन यह चलना और बात करता है और सीआरयूडी को बहुत पसंद करता है, कम से कम जिस तरह से ज्यादातर लोग इसकी व्याख्या करते हैं।
रॉबर्ट हार्वे

11
@RobertHarvey मुझे लगता है कि यह (गलत) समझ है कि यहाँ समस्या है।
जिम्मीजम्स

4
@ जिमीजम्स: यह एक व्यापक गलतफहमी है। चीजों को "आराम" करने के लिए एक मजबूत ड्राइव है जब अधिकांश लोग यह भी नहीं समझते हैं कि लाभ क्या हैं या उन लाभों को कैसे लागू किया जाएगा।
रॉबर्ट हार्वे

4
@RobertHarvey मुझे लगता है कि आप कह रहे हैं कि अगर गलत तरीके से ऐसा करना REST है, तो REST का लक्ष्य नहीं होना चाहिए। ठीक है, लेकिन जिस तरह से मैं इसे देखता हूं, यह 'नॉट रेस्ट' बुलवाना है और मैं बुलशिट बुलबुल को बुलाने का एक बड़ा प्रस्तावक हूं। शब्दों को उपयोगी होने के लिए सामान्यतः समझा जाने वाला अर्थ चाहिए।
जिम्मीजम्स

5
@RobertHarvey दी गई लेकिन ऐसा तब तक नहीं होगा जब तक कि पर्याप्त लोग हैं जो इस शब्द के दुरुपयोग को सही करने के लिए तैयार हैं। मैं तौलिया में फेंकने के लिए तैयार नहीं हूं।
जिम्मीजम्स

24

ध्यान रखने वाली एक और बात निम्नलिखित है ... अपने व्यापार नियमों को सर्वर साइड को मान्य नहीं करना, इसका मतलब है कि आप किसी भी चीज़ पर भरोसा करते हैं, जो पोस्ट अनुरोध के माध्यम से आता है, मान्य है।

उदाहरण के लिए, उदाहरण के लिए, जबकि आपका कोणीय अनुप्रयोग यह जाँच सकता है कि ग्राहक के पास एक वैध आयु सीमा है और यह सुनिश्चित करता है कि वैध उपयोगकर्ताओं को सही प्रतिक्रिया मिले, जो कोई भी आपके एपीआई को यूआरएल जानता है वह कुछ गैर-वैध मूल्यों वाले POST अनुरोध कर सकता है, जो अब मान्य नहीं किया जाएगा।

तो मेरा सुझाव आपके व्यापार नियमों को एपीआई में स्थानांतरित करना होगा, इसे इनपुट को मान्य करने और प्रतिक्रिया के शरीर में उचित त्रुटियों (या शायद सिर्फ गलत संकेत देने वाले कोड) को वापस करने दें। उन कोडों का उपयोग आपके फ्रंट-एंड एप्लिकेशन द्वारा किया जा सकता है ताकि यह पता चले कि क्या गलत हुआ।


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

10

अन्य अच्छे उत्तरों को यहाँ जोड़ने के लिए:

आपका इंटरफ़ेस, REST या अन्यथा, कार्यान्वयन विवरण के आसपास कुछ प्रकार की मान्यताओं के आधार पर विवश नहीं होना चाहिए। यह एक अमूर्त परत के रूप में सेवाओं की धारणा के लिए पूरी तरह से विरोधी है।

सेवाओं का उपयोग करने के मुख्य लाभों में से एक यह है कि ग्राहकों को कुछ भी करने के बिना कार्यान्वयन विवरण को बदला जा सकता है। आपने जो वर्णन किया है, उससे ऐसा लगता है कि कोई वास्तविक अमूर्त परत नहीं है। कार्यान्वयन का विवरण HTTP के माध्यम से उजागर किया गया है। REST के बारे में कुछ भी नहीं कहा गया है कि आवश्यक, सहायक या वांछनीय है। वास्तव में, मुझे लगता है कि मैं REST परिभाषा के कुछ हिस्सों का तर्क दे सकता हूं कि यह वास्तव में गैर-रेस्टफुल कार्यान्वयन है।

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

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


3
REST डेटाबेस रिकॉर्ड के बारे में कुछ नहीं कहता है, अकेले जाने कितने। मैं एक REST सेवा बना सकता हूं जो एक पानी के वाल्व को नियंत्रित करती है, और एक पानी के वाल्व, पानी की आपूर्ति और टैंक स्तर के संसाधनों को उजागर करती है। आप तर्क कर सकते हैं कि भौतिक वस्तुएं खुद एक "डेटाबेस" हैं, लेकिन चीजें थोड़ी खींच रही हैं।
कॉलिन यंग

@ColinYoung हाँ, स्पष्ट करने में मदद करने के लिए धन्यवाद।
जिमीजैम

3

यहाँ कुछ अच्छे जवाब हैं, लेकिन मुझे यकीन नहीं है कि वे आपके सहकर्मियों को समझाने में आपकी मदद करेंगे। जैसा कि कई लोगों ने बताया है कि आप जो सुझाव दे रहे हैं, वह रेस्टफुल डिज़ाइन से हटकर नहीं है, और मुझे लगता है कि उन्हें आपके प्रस्ताव के साथ बोर्ड पर लाना महत्वपूर्ण है।

REST यह सुनिश्चित करने के बारे में नहीं है कि आपका API केवल डेटा संग्रहीत और पुनर्प्राप्त करने की अनुमति देता है। बल्कि, यह संसाधनों के रूप में मॉडलिंग क्रियाओं से संबंधित है । आपके एपीआई को कार्रवाई करने में सक्षम होना चाहिए (यह एक एप्लिकेशन प्रोग्रामिंग इंटरफ़ेस है, सब के बाद)। सवाल यह है कि उन कार्यों को कैसे किया जाए।

एक शब्द के साथ आने के बजाय, उदाहरण शायद अपने सहकर्मियों को यह समझाने का सबसे अच्छा तरीका है । इस तरह से आप यह दिखा सकते हैं कि वे इसे अभी कैसे कर रहे हैं, इससे क्या समस्याएं होती हैं, एक समाधान जो समस्या को हल करता है, और यह कैसे अभी भी बाकी है।

आइए अपने ग्राहक ऑब्जेक्ट को देखें।

संकट:

UI POST एक ग्राहक है, लेकिन बाद की सारणी अभी तक अपडेट नहीं की गई है। यदि आपके UI कोड (या ब्राउज़र प्लग इन, दुर्व्यवहार) में त्रुटि के कारण बाद की कॉल में से एक विफल हो जाती है तो क्या होगा? अब आपका डेटा असंगत स्थिति में है। यह एक ऐसा राज्य भी हो सकता है जो आपके एपीआई या यूआई के अन्य हिस्सों को तोड़ता है, यह उल्लेख करने के लिए नहीं कि यह केवल अमान्य है। आप कैसे ठीक हो? आपको यह सुनिश्चित करने के लिए हर संभव स्थिति का परीक्षण करना होगा कि यह कुछ टूट नहीं जाएगा, लेकिन यह जानना कठिन होगा कि क्या संभव है।

समाधान:

ग्राहकों को बनाने के लिए एक एपीआई एंडपॉइंट बनाएं। आप जानते हैं कि आप "/ ग्राहक / निर्माण" या सम्‍मिलित नहीं करना चाहते हैं / "ग्राहक बनाएँ" समापन बिंदु, क्योंकि बनाना एक क्रिया है और REST का उल्लंघन होगा। इसलिए इसे संज्ञा दें। "" ग्राहक-निर्माण "काम कर सकता है। अब जब आप अपने CustomerCreation ऑब्जेक्ट को पोस्ट करते हैं, तो यह ग्राहक के लिए सभी आवश्यक फ़ील्ड को पूरी तरह से बनाने के लिए भेज देगा। समापन बिंदु यह सुनिश्चित करेगा कि डेटा पूर्ण और वैध है (400 या कुछ लौटाता है यदि यह सत्यापन विफल हो जाता है), और उदाहरण के लिए, सभी एकल डीबी लेनदेन में जारी रह सकता है।

यदि आपको GET / ग्राहक वस्तुओं के लिए एक समापन बिंदु की आवश्यकता है, तो यह ठीक है। आपके पास दोनों हो सकते हैं। ट्रिक एंडपॉइंट बनाने के लिए है जो उपभोक्ताओं की जरूरतों को पूरा करती है।

लाभ:

  1. आप गारंटी देते हैं कि आप खराब स्थिति के साथ समाप्त नहीं होंगे
  2. यह यूआई देवों पर वास्तव में आसान है अगर उन्हें अनुरोधों, सत्यापन चिंताओं, आदि के "पता" को नहीं करना है
  3. यह नेटवर्क अनुरोधों की विलंबता को कम करते हुए, एपीआई की बात नहीं है
  4. परिदृश्यों का परीक्षण करना और उन्हें समझना आसान है (UI से डेटा के गुम / विकृत टुकड़े अनुरोधों में नहीं फैले हैं, जिनमें से कुछ निम्नलिखित हो सकते हैं:)
  5. यह व्यापार तर्क के बेहतर एनकैप्सुलेशन की अनुमति देता है
  6. आम तौर पर सुरक्षा को आसान बनाता है (क्योंकि यूआई में व्यापार और आर्केस्ट्रा तर्क उपयोगकर्ताओं द्वारा संशोधित किया जा सकता है)
  7. तर्क दोहराव को कम करेगा (अधिक संभावना है कि आपके पास एपीआई के 2+ उपभोक्ताओं की तुलना में 2+ एपीआई होंगे जो समान डेटा तक पहुंच प्रदान करते हैं)
  8. फिर भी 100% रेस्टफुल

नुकसान:

  1. यह बैकएंड देव के लिए संभावित रूप से अधिक काम है (लेकिन लंबे समय में नहीं हो सकता है)

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

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

आगे के अध्ययन:

थॉट्सवर्क्स के इस लेख से मुझे वास्तव में व्यावहारिक उदाहरणों का उपयोग करने वाली वस्तुओं के रूप में मॉडलिंग कार्यों का विचार प्राप्त करने में मदद मिली: https://www.thoughtworks.com/insights/blog/rest-ap-design-resource-modeling

मैं CQRS और ईवेंट सोर्सिंग पर पढ़ने का सुझाव भी दूंगा क्योंकि वे इस प्रकार की चीज़ों से वास्तव में चिंतित हैं (यानी वास्तविक दृढ़ता तर्क से आपके एपीआई को तलाक देना)। मुझे नहीं पता कि आपके सहकर्मी इस तरह की चीज़ को पढ़ने के लिए कितने तैयार होंगे, लेकिन यह आपको अधिक स्पष्टता दे सकता है और आपको उन्हें समझाने में मदद करेगा।


" क्योंकि सृजन एक क्रिया है और REST का उल्लंघन करेगा " - बिल्कुल सही। दूसरे शब्दों में, " RPC over REST " को चलाने के लिए यह 47.258.346 वां दृष्टिकोण होगा । जो कुछ ऐसा है जिसे मैं कम से कम "अप्राकृतिक" बताऊंगा, क्योंकि यह Restful दृष्टिकोण का दुरुपयोग करता है और दुरुपयोग करता है (उनके पास उनके उपयोग के मामले हैं, लेकिन RPC उनमें से एक नहीं है) और अक्षम होने का भी संकेत देता है।
JensG
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.