जादूगर के साथ वेब पेजों के लिए REST API डिज़ाइन


11

मेरे पास विज़ार्ड फॉर्मेट के साथ एक वेब पेज है। API का सबमिशन बटन विजार्ड के चौथे चरण में होगा। हालाँकि मैं चाहता हूं कि विज़ार्ड में अगले चरण पर जाने से पहले डेटा को डेटाबेस में संग्रहीत किया जाए। मैं यह भी चाहता हूं कि REST API एकल टैब वाले पृष्ठों के लिए काम कर रहा हो।

इसलिए मैंने क्वेरी पैरामीटर कार्रवाई = ड्राफ्ट या सबमिट करने के लिए एपीआई को डिज़ाइन किया। यदि कार्रवाई का मसौदा तैयार किया जाता है, तो केवल कुछ फ़ील्ड अनिवार्य हैं। यदि कार्रवाई सबमिट की जाती है, तो सभी फ़ील्ड अनिवार्य हैं। REST API की सेवा परत में मान्यताओं को क्वेरी पैरामीटर के आधार पर किया जाएगा। ऐसा लगता है कि मैंने स्पष्ट रूप से निर्दिष्ट किया है कि क्या / अन्यथा दस्तावेज़ में खंड हैं। क्या यह Restful डिजाइन का स्वीकार्य रूप है? इन आवश्यकताओं के साथ सबसे अच्छा डिजाइन क्या होगा?


3
अंतरिम डेटा को डीबी में संग्रहीत करने की आवश्यकता क्यों है?
दान 1701

2
@ Dan1701: ताकि आप विज़ार्ड को दूसरी मशीन से फिर से शुरू कर सकें। लंबे, जटिल रूपों को भरते समय, सभी आवश्यक डेटा को पूरा करने में कुछ दिन लग सकते हैं, क्योंकि उपयोगकर्ता के पास हाथ में तैयार सभी आवश्यक डेटा नहीं हो सकते हैं, या उपयोगकर्ता को विभिन्न स्थानों से अपलोड करने के लिए अतिरिक्त फ़ाइलों को इकट्ठा करने की आवश्यकता हो सकती है। यदि आप अलग-अलग डिवाइस से फिर से शुरू कर सकते हैं, तो आप विज़ार्ड को मोबाइल फोन से एक तस्वीर अपलोड करने के लिए लोड कर सकते हैं, और डेस्कटॉप पर एक वास्तविक कीबोर्ड के साथ एक लंबा विवरण / तर्क टाइप करना जारी रख सकते हैं
रेयान

उस मामले में, मुझे लगता है कि @ guillaume31 का जवाब समझ में आता है।
Dan1701

जवाबों:


7

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

POST /wizard/123/step1
POST /wizard/123/step2
POST /wizard/123/step3

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


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

आपका स्वागत है। वैसे, "दो तालिका" दृष्टिकोण इस के साथ पारस्परिक रूप से अनन्य नहीं है। प्रति चरण एक HTTP संसाधन होने से आपके ऑब्जेक्ट मॉडल को एप्लिकेशन सर्वर पर निर्देशित नहीं किया जाता है, अकेले डेटाबेस स्कीमा को दें। यह सिर्फ एक वेब प्रतिनिधित्व है।
guillaume31

1
@ टेकचर्च मूल रूप से गिलियूम का अर्थ है कि फार्म का प्रतिनिधित्व करने वाली वस्तु / तालिका को भागों में विभाजित किया जा सकता है, जहां प्रत्येक चरण में मॉडल का हिस्सा बचाया जाता है। वास्तव में, आपके पास प्रत्येक "कदम" पूरे मॉडल के हिस्से के लिए एक रूप हो सकता है । और अगर आप इस दृष्टिकोण को लेते हैं, तो यह वास्तव में वास्तुकला को अविश्वसनीय रूप से सरल बनाता है। सर्वर पर प्रत्येक POST एक ही मॉडल को बनाएगा (बनाएगा) या अपडेट करेगा, और प्रत्येक GET एक ही मॉडल को लोड करेगा, और प्रत्येक चरण उन क्षेत्रों के सेटों को भरने के लिए एक रूप होगा जो शब्दार्थ रूप से सार्थक हैं (एक साथ हैं)। और बस के लिए in_progressया मॉडल पर एक बूलियन है draft
क्रिस क्रिफ़िस

3

मुझे कुछ समय पहले ऐसा ही कुछ करने की आवश्यकता थी, और निम्नलिखित वर्णन करता है कि हम क्या करते हैं।

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

दो तालिका दृष्टिकोण के लाभ:

  • डेटाबेस में, आप अनफिनिश्ड इटेम टेबल की तुलना में आइटम टेबल पर तंग बाधाएं रख सकते हैं; आपके पास वैकल्पिक कॉलम होने की आवश्यकता नहीं है जो कि विज़ार्ड समाप्त होने पर वास्तव में आवश्यक होंगे।

  • रिपोर्टिंग के लिए तैयार किए गए आइटमों के बारे में अलग-अलग क्वेरी करना आसान है क्योंकि आपको अधूरापन के बारे में याद नहीं रखना है। हमारे मामले में, हमें आइटम और अनफिनिश्ड इट्स के बीच समग्र प्रश्न करने की आवश्यकता नहीं है, इसलिए यह कोई समस्या नहीं है।

हानि:

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

अन्य संभावनाओं पर मैंने विचार किया है और हम उनके साथ क्यों नहीं गए:

  • कुकीज़ या लोकल स्टोरेज में डेटा की बचत: उपयोगकर्ता किसी अन्य डिवाइस से अपना सबमिशन जारी नहीं रख सकते हैं या यदि वे अपना ब्राउज़र इतिहास हटाते हैं
  • डेटाबेस या द्वितीयक डेटास्टोर पर अधूरे डेटा (जैसे JSON) के रूप में अनफिनिश्ड इट को संग्रहीत करें: मुझे पार्सिंग तर्क को परिभाषित करना होगा और Django के स्वचालित मॉडल / फ़ॉर्म सत्यापन का उपयोग नहीं कर सकते।
  • ग्राहक पक्ष पर प्रति चरण सत्यापन करें: मुझे पायथन / Django और जावास्क्रिप्ट के बीच सत्यापन तर्क की नकल करनी होगी।

1
'ड्राफ्ट' प्रकार मॉडल और 'समाप्त' मॉडल पर मान्यताओं को इंगित करने के लिए +1; मैंने ऐसा नहीं सोचा था, और यह एक महत्वपूर्ण बिंदु है जिसे ध्यान में रखा जाना चाहिए। अन्यथा शायद ifआपके पूरे सत्यापन में ड्राफ्ट स्टेटस की जाँच करने वाले बयानों का एक समूह होगा, जो सिर्फ अच्छा नहीं होगा। हालांकि रूबी जैसे पटरियों पर कुछ बहुत ही परिष्कृत रूपरेखाएँ उस समस्या को सरलता से लागू कर सकती हैं अगर इसे सही ढंग से लागू किया जाए।
क्रिस साइरफाइस

1

मैंने इसे @ guillauma31 और @Lie Ryan के समाधान के मिश्रण के समान लागू किया है।

यहाँ प्रमुख अवधारणाएं हैं:

  1. एक 3 कदम विज़ार्ड है जो आंशिक रूप से पूर्ण होने तक बनाए रखा जा सकता है।
  2. हर कदम अपने आप संसाधन (जैसे .: है /users/:id_user/profile/step_1, .../step_2आदि)
  3. प्रत्येक चरण पर, डेटा और पूर्णता स्थिति को GET अनुरोधों के माध्यम से प्राप्त किया जा सकता है और PATCH अनुरोधों के माध्यम से जारी रखा जा सकता है।
  4. प्रत्येक संसाधन में दर्ज डेटा के लिए अपने सत्यापन नियम हैं।
  5. प्रत्येक चरण एक कुंजी देता है जिसे अनुक्रम की गारंटी देने के लिए अगले चरण के इनपुट में उपयोग किया जाना है। एक बार उपयोग या एक नया उत्पन्न होने के बाद, यह टोकन समाप्त हो जाता है।
  6. अंतिम चरण पर, हमारे पास डेटाबेस पर सभी आवश्यक डेटा हैं और एक पुष्टिकरण स्क्रीन प्रदर्शित की गई है। यह पुष्टि डेटा को पूर्ण (उदाहरण के लिए .../profile/confirm) चिह्नित करने के लिए किसी अन्य संसाधन को कॉल करती है । इस संसाधन को फिर से सभी डेटा प्राप्त करने की आवश्यकता नहीं है। यह केवल डेटा को सही और पूर्ण के रूप में चिह्नित करता है।
  7. एक निर्धारित दिनचर्या है जो इस अधूरी प्रविष्टियों को मिटा देती है जो कुछ दिनों से अधिक होती है।

सामने वाले लोगों को काम करने वाले जादूगर के आगे और पीछे के प्रवाह को पाने के लिए टोकन का ध्यान रखना पड़ता है।

एपीआई स्टेटलेस और एटॉमिक है।

इस सेटअप के साथ "वन स्टेप विजार्ड" कार्य करने के लिए आपको कुछ चीजों को बदलना होगा, जैसे कि टोकन का प्रवाह हटाना या विज़ार्ड के प्रकार के आधार पर टोकन वापस करने के लिए एक संसाधन बनाना या केवल इस विशिष्ट सिंगल को भरने के लिए एक नया संसाधन बनाना कदम जादूगर (जैसे PUT /users/:id_user/profile/)।

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