एकल-पृष्ठ अनुप्रयोगों में दूरस्थ सेवा विधियों की सरल कॉल

इस लेख में, मैं क्लाइंट-सर्वर इंटरैक्शन के आयोजन में अपना दृष्टिकोण साझा करना चाहता हूं, जावा में सर्वर साइड के साथ सिंगल-पेज ब्राउज़र अनुप्रयोगों में।

संक्षेप में, मैं इस दृष्टिकोण को "Json दूरस्थ सेवा प्रक्रिया कॉल" - JRSPC कहता हूं। (बहुत सामंजस्यपूर्ण नहीं, शायद, लेकिन आप एक गीत से एक शब्द नहीं मिटा सकते।)

Jrspc का उपयोग - क्लाइंट और सर्वर पर सेवा इंटरफेस की परिभाषाओं की परतों के उपयोग को समाप्त करता है, जो कोड की मात्रा को कम करता है, इसकी रीफैक्टरिंग को सरल करता है, और त्रुटियों की संभावना को कम करता है।
इस दृष्टिकोण का उपयोग करते हुए, हम केवल वही कोड लिख सकते हैं जो व्यावसायिक तर्क के लिए जिम्मेदार है,
नई व्यावसायिक पद्धति को परिभाषित करते समय अतिरिक्त कोड की आवश्यकता नहीं है।

उदाहरण के लिए, एक सर्वर पर, व्यवसाय विधि की परिभाषा इस तरह दिखती है:

@Component("testService") public class TestService{ @Remote public String testMethod(Long userId, String role, boolean test, List<User> users, User user){ ... return "ok"; } } 


और क्लाइंट पर इसकी कॉल इस तरह है:

 var params = [userId, role, true, [{id:1, login:"111"}, {id:2, login:"222"} ], {id:3, login:"333"}] Server.call("testService", "testMethod", params, sucessCallback, errorCallback, controlWhichWillDisabledUntilResponse); 


इससे अधिक, एक विधि को परिभाषित करते समय, कहीं भी कोई कोड नहीं लिखा जाता है।


यह कैसे काम करता है


परिवहन स्तर पर, jrspc - json-rpc का उपयोग करता है, कॉल में निर्दिष्ट करने की क्षमता के साथ न केवल एक विधि है, बल्कि एक सेवा भी है। इसलिए, ऐसे json-rpc को json-rspc (s-service) कहा जा सकता है।

यदि विनिर्देश उस पर मौजूद था, तो यह json-rpc 2.0 विनिर्देश के समान होगा, सिवाय इसके कि सेवा क्षेत्र को अनुरोध ऑब्जेक्ट में जोड़ा जाएगा, और आईडी फ़ील्ड वैकल्पिक होगी, और उत्तर में - वैकल्पिक त्रुटि कोड।

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

ग्राहक भाग


इस एप्लिकेशन का क्लाइंट हिस्सा AngularJS फ्रेमवर्क में लिखा गया है।
चेतावनी
(मैं इसे उन लोगों को चेतावनी देना अपना कर्तव्य समझता हूं जिन्होंने अभी तक इस पर लिखने की कोशिश नहीं की है:
{{user.name}}, कोणीय एक कठिन दवा है!
इसके आदी होने के लिए, यह केवल एक बार चर्चा को पकड़ने के लिए पर्याप्त है।)

डिजाइन के लिए, बूटस्ट्रैप का उपयोग किया जाता है।

बैक एंड में, स्प्रिंग

JSON ऑब्जेक्ट के कार्यान्वयन के रूप में, JSONObject -lib लाइब्रेरी से JSONObject का उपयोग किया जाता है।

ग्राहक के हिस्से में तीन फाइलें होती हैं:

ajax-कनेक्टर . js

Server ऑब्जेक्ट में लागू सर्वर अनुरोध तंत्र का कार्यान्वयन।
(अजाक्स उपसर्ग का उपयोग इसे वेब-सॉकेट ws-कनेक्टर.js से अलग करने के लिए किया जाता है, जिसके द्वारा इसे बदल दिया जा सकता है, बिना उपयोगकर्ता-नियंत्रक.जेएस कोड को बदले।)

उपयोगकर्ता के controller.js

यहाँ userController फ़ंक्शन में userController गए एप्लिकेशन का व्यावसायिक तर्क है।

application.html


एलिमेंट GUI एलिमेंट लॉकिंग लॉजिक के साथ।

जैसा कि आप देख सकते हैं, स्क्रिप्ट कोड के दृश्य में, रिमोट सर्वर एक सर्वर ऑब्जेक्ट की तरह दिखता है, जिसे यूआरएल के साथ आरंभीकृत किया जाना चाहिए।

इस ऑब्जेक्ट के माध्यम से, हम सर्वर पर किसी भी घटक को एक्सेस कर सकते हैं और इसके किसी भी तरीके को कॉल कर सकते हैं:

Server.call(serviceName, mathodName, [param1, param2, ...], successCallBack, errorCallback, control);

उत्तर या त्रुटियां - उचित कॉलबैक पर आते हैं।

सर्वर पर एक नई सेवा या विधि जोड़ने से ग्राहक कोड किसी भी तरह से प्रभावित नहीं होता है, और हम सर्वर कोड में दिखाई देने के तुरंत बाद इन सेवाओं और विधियों को कॉल कर सकते हैं।

स्वाभाविक रूप से, "किसी को और किसी को भी" कहना - मैं सच्चाई से थोड़ा विदा हो गया।
वास्तव में, दूरस्थ सेवाओं के रूप में, केवल AbstractService से ली गई कक्षाओं को बुलाया जा सकता है, और रिमोट नामक तरीकों को @Remote द्वारा एनोटेट किया जाना चाहिए।

विधियों के उपयोग के अधिकारों के प्रतिबंध के लिए - एनोटेशन @Secured(roleName)
इसलिए, उदाहरण के लिए, @Secured("Admin") साथ एनोटेट की गई विधि को उपयोगकर्ता द्वारा "उपयोगकर्ता" भूमिका के साथ नहीं बुलाया जा सकता है।

सर्वर भाग


पूरे सर्वर "फ्रेमवर्क", इसलिए बोलने के लिए, 9 केबी से कम समय लगता है। और इसमें छह वर्ग शामिल हैं, जिनमें से दो पहले से ही हमें एनोटेशन से परिचित हैं: रिमोट और सुरक्षित , साथ ही साथ एब्सट्रैक्ट -
अमूर्त वर्ग जिसमें से सभी सेवाओं को विरासत में प्राप्त किया जाना चाहिए, और कॉमनसेवरकंट्रोलर

उनकी विधि processAjaxRequest अनुरोध Service स्क्रिप्ट ऑब्जेक्ट से आते हैं।

अगला, सेवा के नाम से एक घटक है, और उस पर, एक्सेस अधिकारों की जांच करने के बाद, प्रतिबिंबित, निर्दिष्ट विधि कहा जाता है।

उपयोगकर्ता ऑब्जेक्ट ( User दृढ़ता के अनुकरण के साथ परीक्षण कार्यान्वयन) के लिए उपयोगकर्ता और उपयोगकर्ता प्रबंधक के बारे में डेटा संग्रहीत करने के लिए उपयोगकर्ता (इकाई )।

व्यावसायिक तर्क को दो सेवाओं में लागू किया जाता है: TestUserService - पंजीकरण करने, लॉगिन करने और डेटा संपादित करने के तरीकों के साथ एक सेवा, और TestAdminService - एक उपयोगकर्ता को हटाने और उसकी भूमिका को बदलने के तरीकों के साथ एक सेवा।

कोड को यथासंभव आत्म-व्याख्यात्मक लिखा गया है, इसलिए मुझे उम्मीद है कि इसे समझना आसान होगा।

Github डेमो कोड

आगे क्या है?


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

Update2:
अपडेट 1 - लेख के मुख्य भाग में ले जाया गया।

Source: https://habr.com/ru/post/In211937/


All Articles