सिम्फनी के साथ बाहरी रेस्टफुल एपीआई का उपभोग कैसे करें?


10

हम अपनी परियोजनाओं के लिए एक माइक्रोसैसवर्क वास्तुकला का निर्माण कर रहे हैं, जिसमें ज्यादातर फ्रंट-एंड सिम्फनी एप्लिकेशन हैं, जो बैक-एंड रेस्टफुल एपीआई के साथ बातचीत कर रहे हैं।

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

उदाहरण के लिए, एक ग्राहक इकाई के साथ:

  • सिद्धांत का उपयोग करते हुए, हमें बस अपने ग्राहक वर्ग को परिभाषित करना होगा, और अब अपने ग्राहकों को बनाना, अपडेट करना, पुनः प्राप्त करना आसान है
  • REST API दृष्टिकोण का उपयोग करते हुए, क्लाइंट्स API के माध्यम से पहुंच योग्य होते हैं, लेकिन क्लाइंट (POST), अपडेटेड (PUT), पुनर्प्राप्त (GET), आदि को कैसे परिभाषित किया जाए यह परिभाषित करने के लिए हमारे पास बहुत सारे काम हैं।

विख्यात ग्राहकों को कई अनुप्रयोगों द्वारा उपयोग किया जाता है, न केवल फ्रंट-एंड ऐप, इसलिए समर्पित एपीआई।

क्या हमें एपीआई कॉल कॉम्प्लेक्सिटी को छिपाने वाली इकाई जैसे तरीकों से कक्षाएं बनानी चाहिए, सभी एपीआई डेटा को स्थानीय स्तर पर आयात करना और उन्हें डॉक्ट्रिन या किसी अन्य तरीके से एक्सेस करना चाहिए?


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

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

यहाँ एक समान दृष्टिकोण लागू किया गया था। व्यावसायिक तर्क अब एक 'एक्शन' लेयर में समाहित है, जो इस बात की परवाह नहीं करता है कि यह REST एपी है या कोई क्ली कमांड इसे बुला रहा है। एलिस्टेयर कॉकबर्न का षट्कोणीय डिजाइन हमारे मामले में एक शानदार शुरुआती बिंदु था: alistair.cockburn.us/Hexagonal+altecture
upstream

जवाबों:


2

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

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

क्लाइंट लाइब्रेरी इंटरफ़ेस (उदाहरण यह कैसे दिख सकता है):

class ApiClient {

   /**
    * @throws SomeApiException If credentials are invalid
    * @return ApiUser
    */
   public function authenticate($username, $password);

   /**
    * @return ApiUser
    */
   public function findUserByEmail($email);

   /**
    * @throws SomeApiException If email is invalid
    * @return void
    */
   public function changeUserEmail(User $user, $newEmail);
}

क्लाइंट लाइब्रेरी आंतरिक रूप से परिणामों के कैशिंग के लिए संचार और डॉक्ट्रीन कैश घटक के लिए गज़ल का उपयोग करती है। इकाई ऑब्जेक्ट्स और जोंस के बीच मैपिंग मैपर्स द्वारा बनाई गई थी, कि एक बार लिखा गया था - बहुत बार नहीं बदला (या घटना बिल्कुल)। इस मामले में मैं JSON से और के लिए एक स्वचालित परिवर्तन के लिए JMS धारावाहिक का उपयोग करने का सुझाव दूंगा (मेरा मानना ​​है कि आप JSON का उपयोग करते हैं)।

आपको रेडिस की तरह एक अच्छे कैशिंग तंत्र और स्थानीय भंडारण की आवश्यकता होगी। प्रत्येक एप्लिकेशन के अनुरोध पर एप-कॉल करना आपके सर्वर को मार देगा और आपके आवेदन को काफी धीमा कर देगा। यह समझना बहुत महत्वपूर्ण है कि http कैश कैसे काम करता है। यदि आपकी एपीआई कैशिंग हेडर का उपयोग नहीं करती है (या अस्पष्ट तरीके से इसका उपयोग करती है) तो परिवर्तनों का ट्रैक रखने के लिए यह बहुत कठिन और संसाधन-खपत होगा।

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

और डॉक्ट्रिन की बात करते हुए, " कानून के साधन " देखें।


1

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


0

FYI करें, अब v4.3 के लिए एक HttpClient घटक है।

https://symfony.com/blog/new-in-symfony-4-3-httpclient-component


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