एमवीसी और रेस्टफुल एपीआई सेवा


12

MVC बहुत सीधा है। एक मॉडल, एक नियंत्रक और एक दृश्य है। जब हम एक वेबसाइट बनाते हैं, तो यह सब एक साथ आता है क्योंकि ' क्लाइंट सर्वर पर रिस्टोर कीवर्ड रिक्वेस्ट भेजता है -> सर्वर अनुरोधित यूआरएल को कंट्रोलर एक्शन से मिलाता है -> जिसके बाद डेटा इकट्ठा / प्रोसेसिंग के लिए मॉडल (ओं) को कॉल करता है, परिणाम मिलता है। -> और परिणाम को क्लाइंट को HTML पेज (दृश्य) के रूप में वापस लौटाता है

क्या होगा अगर हम शुद्ध रेस्टफुल एपीआई वेब सेवा के बारे में बात कर रहे हैं? फिर ' क्लाइंट के साथ प्रवाह कुछ इस तरह होता है कि ग्राहक सर्वर पर REST कीवर्ड रिक्वेस्ट भेजता है -> सर्वर अनुरोधित यूआरएल को कंट्रोलर एक्शन से मेल खाता है -> जिसके बाद डेटा इकट्ठा / प्रसंस्करण के लिए मॉडल (ओं) को कॉल करता है, परिणाम मिलता है -> और रिटर्न परिणाम JSON में क्लाइंट को वापस '। पहले जैसा ही, लेकिन कोई 'दृश्य' नहीं है ... या बल्कि, उत्पन्न JSON को एक 'दृश्य' के रूप में सोचा जा सकता है। एक मायने में, हम केवल एमवीसी के एमसी भाग का उपयोग कर रहे हैं। क्या यह है कि यह कैसे किया जाना चाहिए? या एमवीसी के बजाय एपीआई-केवल सेवा के लिए कोई अन्य, बेहतर-अनुकूल पैटर्न हैं?

जवाबों:


21

MVC स्मालटाक दुनिया से संबंधित एक प्रतिमान है कि कैसे ऑब्जेक्ट ओरिएंटेड सिस्टम में UI हो सकते हैं।

शुरुआती वेब फ्रेमवर्क ने सामान्य विचार (अलग-अलग व्यावसायिक तर्क, तर्क को नियंत्रित करने और तर्क को देखने के लिए) को लिया और सिद्धांत को लागू किया कि उन्होंने वेब एप्लिकेशन को कैसे संरचित किया। इससे पहले यह असामान्य नहीं था कि डोमेन ऑब्जेक्ट्स के अंदर HTML पीढ़ी के कोड या ई-मेल टेम्प्लेट के अंदर व्यावसायिक तर्क में ईश्वर की भयानक गड़बड़ हो (बहुत शुरुआती PHP समझें)

बात यह है कि स्मालटाक दुनिया से मूल एमवीसी वास्तव में वही नहीं है जो अधिकांश वेब फ्रेमवर्क में एमवीसी होता है। एचटीएमएल आउटपुट वास्तव में "दृश्य" नहीं है कि स्मॉलटाक ने यूआई स्क्रीन को समझा।

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

दूसरे MVC सर्वर साइड कोड को संरचित करने का एक तरीका है। इसका वास्तव में REST / HTTP से कोई लेना-देना नहीं है। REST का संबंध है कि क्लाइंट और सर्वर कैसे संवाद करते हैं। यह परवाह नहीं करता है कि सर्वर क्लाइंट को जो प्रतिनिधित्व भेजता है वह एक HTML टेम्पलेट में है जो कि एक टेंपलेटिंग इंजन, या एक JSON ऑब्जेक्ट जो कंट्रोलर में एक कॉल था, के साथ निर्माण करने के लिए बहुत लिया।

अगर आपको नहीं लगता कि आपके सर्वर को एक "दृश्य" परत की आवश्यकता है जो ठीक है। आप अभी भी अपने व्यावसायिक तर्क (यानी मॉडल) को एक विशिष्ट HTTP अनुरोध को संभालने वाले नियंत्रकों से अलग करने का लाभ प्राप्त करेंगे, भले ही सभी नियंत्रक किसी वस्तु पर JSON पार्सिंग कॉल को कॉल करें और उस डेटा को वापस करें।


बिल्कुल वही जो मुझे सुनने की जरूरत थी। मैं वेब देव दुनिया (एक-फाइल-स्क्रिप्ट के साथ) से आता हूं, इसलिए मैंने यह नहीं देखा है कि गैर-वेब बड़े पैमाने पर एप्लिकेशन कैसे ususally संरचित हैं। वर्तमान में मैं जिस प्रणाली को लागू कर रहा हूं वह एक नियमित वेब ऐप से परे है। इसलिए मैंने अब तक जो पढ़ा है, उससे कोई फर्क नहीं पड़ता कि आप ऐप स्रोत को कैसे बनाते हैं, मुख्य लक्ष्य यह है कि इसे नेविगेट करना और बनाए रखना आसान है। मैं अपने ऐप की संरचना के लिए MVC पैटर्न से अवधारणाओं का उपयोग करूंगा। धन्यवाद!
सिमोन

@ लाइम ... मुख्य लक्ष्य नेविगेट करना और बनाए रखना आसान बनाना है। क्या यह हमेशा लक्ष्य नहीं है?
एंडी

@ डेविड पैकर बेशक यह =) मैं अभी भी एक अवधारणा पर बंद था, उस अवधारणा के वास्तविक उपयोग पर गायब था ।
सिमोन

1
स्वच्छ वास्तुकला पर बॉब मार्टिन की प्रस्तुति देखें, यदि आप किसी एप्लिकेशन को संरचना करने के लिए एक अलग, संभावित रूप से बेहतर तरीके से देखना चाहते हैं, जिस तरह से कई वेब फ्रेमवर्क करते हैं।
कॉर्मैक मुलहॉल

9

दृश्य एक परत है जो सूचना प्रदर्शित करने के लिए ज़िम्मेदार है जिसे आपके एप्लिकेशन के उपयोगकर्ता / ग्राहक द्वारा व्याख्या किया जा सकता है (यह नहीं कहता कि उपयोगकर्ता को वास्तविक व्यक्ति होना है)। JSON एक दृश्य परत के लिए पूरी तरह से मान्य प्रारूप है, कंप्यूटर समझते हैं कि।

जब तक दृश्य परत ऐसी जानकारी प्रकाशित करती है जिसका उपयोग उपयोगकर्ता आपके आवेदन में मॉडल को प्रभावित करने के लिए कर सकता है, इससे कोई फर्क नहीं पड़ता कि दृश्य कैसा दिखता है, यह अभी भी एक दृश्य है, एक परत उपयोगकर्ता और सिस्टम के बीच मिडलवेयर के रूप में कार्य करती है। ।


2

MVC बहुत सीधा है।

मार्टिन फाउलर, शायद, इससे असहमत होंगे :

अलग-अलग जगहों पर एमवीसी के बारे में पढ़ने वाले अलग-अलग लोग इससे अलग-अलग विचार लेते हैं और इन्हें 'एमवीसी' के रूप में वर्णित करते हैं।

आगे बढ़ते रहना...

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

ठीक है, यह एक उलझन है

MVC, जो कुछ भी है, उपयोगकर्ता इंटरफेस को लागू करने के लिए विचारों का एक संग्रह है।

REST बड़े पैमाने पर अनुप्रयोगों के निर्माण के लिए वास्तु बाधाओं का एक संग्रह है।

वेब, जो आप यहां बात कर रहे हैं, एक विशाल दस्तावेज़ प्रबंधन अनुप्रयोग है जो उन्हीं बाधाओं का उपयोग करके बनाया गया है।

आप दोनों के बीच जो समानताएं देख रहे हैं, वे गलत तरीके से जिम्मेदार या सतही हैं।

RESTafarians का एक आम समझ है HATEOAS "आवेदन राज्य के इंजन के रूप में हाइपरटेक्स्ट",, और कहा कि अलार्म आप के माध्यम से सिर बज भेजना चाहिए - क्यों एक हैं दृश्य के एक इंजन राज्य ? यदि हम आधार पर सवाल उठाते हैं, और अतिरिक्त सबूतों की तलाश करते हैं, तो हम दो विषम चीजों को भी नोटिस कर सकते हैं।

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

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

पहेली का जवाब, ज़ाहिर है, HTML दृश्य नहीं है। ब्राउज़र में विजेट्स का संग्रह दृश्य है, और वे डॉक्यूमेंट ऑब्जेक्ट मॉडल के साथ संचार में हैं , जिसे HTML को पढ़कर आरम्भ किया गया था।

दूसरे शब्दों में, HTML राज्य का एक प्रतिनिधित्व है, जैसे रॉय टी। फील्डिंग ने वादा किया था।

क्या होगा अगर हम एक शुद्ध रेस्टफुल एपीआई वेब सेवा के बारे में बात कर रहे हैं ...? पहले जैसा ही, लेकिन कोई 'दृश्य' नहीं है

अधिक सही ढंग से, पहले जैसा ही: कोई दृश्य नहीं है। HTML की तरह ही JSON, राज्य का प्रतिनिधित्व करता है, जो प्रक्रिया की सीमाओं को पार करने के लिए उपयुक्त है।

"डीटीओ" या "संदेश" के बारे में सोचें और आपके द्वारा भटकने की संभावना कम होगी।


मैंने एक आर्किटेक्चरल पैटर्न के साथ वेब अनुरोधों को अधिक आसानी से मिश्रित किया है जो मुझे एक संपूर्ण के रूप में अवधारणा में परेशान करता है। आप कह रहे हैं: "ब्राउज़र में विजेट्स का संग्रह दृश्य है" - फिर मैं rephrase: क्या होगा अगर कोई मानव ब्राउज़र में 'ब्राउज़र' नहीं है? क्या होगा अगर यह एक और रोबोट सेवा से जुड़ रहा है? यदि JSON और HTML राज्य का प्रतिनिधित्व करते हैं, तो 'एक संदेश' या 'DTO' राज्य प्रतिनिधित्व के लिए एक परिवहन है। तो फिर 'एक दृश्य' कहाँ आता है? आपने अपने उत्तर से मुझे और भी भ्रमित कर दिया है।
सिमोन

सेवा से जुड़ने वाला प्रोग्राम / रोबोट सीधे मॉडल में हेरफेर करेगा - इसे देखने की आवश्यकता क्यों होगी?
VoiceOfUnreason

1

यह है कि यह कैसे किया जाना चाहिए?

JSON को दृश्य के रूप में पास करना, या दृश्य निर्माण के लिए इसे दृश्य मॉडल के रूप में उपयोग करना पैटर्न का उल्लंघन नहीं करता है।

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

या एमवीसी के बजाय एपीआई-केवल सेवा के लिए कोई अन्य, बेहतर-अनुकूल पैटर्न हैं?

ईमानदारी से, कोई विचार नहीं। लेकिन मुझे लगता है कि आप एमवीसी का उपयोग करते हैं या नहीं, यह महत्वपूर्ण नहीं है। जो भी आपको सुविधाजनक लगे, उसका उपयोग करें। जब वेब सेवाओं के बारे में बात की जाती है, तो विचार करने के लिए बहुत अधिक महत्वपूर्ण पहलू हैं (जो सीधे एमवीसी से संबंधित नहीं हैं), उदाहरण के लिए सुरक्षा, स्थिरता, उपलब्धता, आदि।

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