2010-10-05 6 views
63

मैं वर्तमान में एक मौजूदा PHP अनुप्रयोग के लिए एपीआई डिजाइन कर रहा हूं, और अंत में एक समझदार वास्तुकला दृष्टिकोण के रूप में आरईएसटी की जांच कर रहा हूं।रीस्टफुल एपीआई में ऑब्जेक्ट पदानुक्रमों से मुझे कैसे निपटना चाहिए?

मेरा मानना ​​है कि मेरे पास महत्वपूर्ण अवधारणाओं का उचित ज्ञान है, लेकिन मैं ऑब्जेक्ट पदानुक्रमों और आरईएसटी से निपटने वाले किसी भी व्यक्ति को ढूंढने के लिए संघर्ष कर रहा हूं।

Users 
L which have one-to-many Channel objects 
L which have one-to-many Member objects 

आवेदन ही हम की सरणियों के साथ उपयोगकर्ता वस्तु को भरने के लिए एक आलसी लोड दृष्टिकोण का उपयोग में:

यहाँ समस्या ...

[आवेदन] व्यापार वस्तु पदानुक्रम में हमारे पास है आवश्यकतानुसार इन वस्तुओं। मैं ओओ शब्दों में विश्वास करता हूं कि यह ऑब्जेक्ट एकत्रीकरण है, लेकिन मैंने विभिन्न नामकरण विसंगतियों को देखा है और सटीक नामकरण सम्मेलन के बारे में युद्ध शुरू करने की परवाह नहीं है।

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

एक आरईएसटी परिप्रेक्ष्य से, मैं यह पता लगाने की कोशिश कर रहा हूं कि दृष्टिकोण क्या होना चाहिए। पूरी तरह से पॉप्युलेट वस्तुओं -

विकल्प 1::

GET api.example.com/user/{user_id} 

उपयोगकर्ता ऑब्जेक्ट (संसाधन) पढ़ें और सभी के साथ उपयोगकर्ता ऑब्जेक्ट प्रदान यहाँ मेरी वर्तमान सोच है (कुछ समय के लिए ही प्राप्त पर विचार) संभावित चैनल और सदस्य ऑब्जेक्ट्स प्री-लोडेड और एन्कोडेड (जेएसओएन या एक्सएमएल)।

पेशेवरों: वस्तुओं की संख्या को कम करने, वस्तु पदानुक्रम का कोई ट्रेवर्सल आवश्यक
कान्स: वस्तुओं को पूरी तरह से आबादी वाले किया जाना चाहिए (महंगा)

विकल्प 2 - प्राथमिक वस्तु को पॉप्युलेट और अन्य वस्तु संसाधनों के लिए लिंक शामिल हैं:

GET api.example.com/user/{user_id} 

उपयोगकर्ता ऑब्जेक्ट (संसाधन) पढ़ें और उपयोगकर्ता वस्तु उपयोगकर्ता डेटा आबादी वाले और दो सूचियों लौट आते हैं।

प्रत्येक सूची का संदर्भ उचित (उप) संसाधन यानी

api.example.com/channel/{channel_id} 
api.example.com/member/{member_id} 

मुझे लगता है कि इस के पास (या वास्तव में) हाइपरमीडिया के निहितार्थ है - जब तक ग्राहक अन्य संसाधनों प्राप्त कर सकते हैं अगर यह चाहता है (मैं उन्हें समझदारी से टैग)।

पेशेवरों: ग्राहक मातहत या अन्यथा, बाकी संसाधनों के रूप में वस्तुओं की बेहतर जुदाई लोड करने के लिए चुन सकते हैं
कान्स: आगे माध्यमिक संसाधनों

विकल्प 3 प्राप्त करने के लिए आवश्यक यात्रा - सक्षम पुनरावर्ती retrieves

GET api.example.com/user/{user_id} 

उपयोगकर्ता ऑब्जेक्ट पढ़ें और उप-ऑब्जेक्ट्स की सूचियों के लिंक शामिल करें यानी

api.example.com/user/{user_id}/channels 
api.example.com/user/{user_id}/members 

/चैनलों कॉल के रूप में चैनल संसाधनों की एक सूची वापस होगा (ऊपर के रूप में):

api.example.com/channel/{channel_id} 

पेशेवरों: प्राथमिक संसाधनों का पर्दाफाश जहां subodinates प्राप्त करने के लिए, लेकिन वे क्या नहीं कर रहे हैं जाने के लिए (अधिक विश्वसनीय?), अधीनस्थों को आगे बढ़ाने के लिए कोई आवश्यकता नहीं है, अधीनस्थ सूची जनरेटर (/ चैनल और/सदस्य) इंटरफेस प्रदान करते हैं (जैसे विधि) प्रतिक्रिया को और अधिक सेवा प्रदान करते हैं।
कान्स: तीन कॉल अब पूरी तरह से वस्तु को भरने के लिए आवश्यक

विकल्प 4 - (पुनः) बाकी

मैं कर रहा हूँ [मौजूदा] आवेदन वस्तु पदानुक्रम फिर से उपयोग करने और करने की कोशिश कर के लिए वस्तु डिजाइन पर विचार इसे आरईएसटी पर लागू करें - या शायद अधिक सीधे, इसे एपीआई इंटरफ़ेस प्रदान करें।

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

उपर्युक्त पर किसी भी विचार का स्वागत है।

बहुत धन्यवाद

पॉल

+0

मेरी खोज में मुझे लेखों का यह सेट भी मिला है जो मुझे बहुत उपयोगी और सुलभ पाया गया: http://www.infoq.com/minibooks/emag-03-2010-rest – paulkmoore

+0

यदि आप एक की तलाश में हैं उन सभी शैलियों के लिए JSON- आधारित मीडिया प्रकार, शोजी पर विचार करें: http://www.aminus.org/rbre/shoji/shoji-draft-02.txt – fumanchu

उत्तर

38

इन गठबंधन करने के लिए नहीं कोई कारण नहीं है।

  • api.example.com/user/{user_id} - या चैनल आईडी की एक सूची प्रदान (अपनी पूरी अभ्यावेदन के लिए लिंक -
  • api.example.com/user/{user_id}/channel_list चैनल अभ्यावेदन की एक सूची प्रदान - एक चैनल प्रतिनिधित्व
  • api.example.com/user/{user_id}/channels वापसी - एक प्रयोक्ता प्रतिनिधित्व
  • api.example.com/channel/{channel_id} वापसी , उपरोक्त लिंक का उपयोग करके)

संदेह में, इस बारे में सोचें कि आप मानव उपयोगकर्ता को डेटा कैसे प्रदर्शित करेंगे "एपीआई" चिंताओं के बिना: उपयोगकर्ता दोनों इंडेक्स पेज ({user_id}/channel_list) और पूर्ण दृश्य ({user_id}/channels) चाहता है।

एक बार आपके पास यह हो जाने के बाद, केवल HTML प्रारूप के रूप में (या इसके अलावा) HTML के बजाय JSON का समर्थन करें, और आपके पास REST है।

+1

इसे रखने का शानदार तरीका। –

+0

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

+3

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

24

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

api.example.com/completeuser/{id} 
api.example.com/linkeduser/{id} 
api.example.com/lightweightuser/{id} 

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

कहाँ मैं एक वस्तु प्रभावी रूप से एक बहु-भाग वस्तु है कि है, मैं इलाज के लिए है कि एक ही संसाधन के रूप में की जरूरत है:

+0

डैरल - इसके लिए धन्यवाद - भी बहुत उपयोगी है। मुझे संदेह था कि ऑब्जेक्ट मैपिंग के आस-पास कुछ सूक्ष्मता थी जिसे मैं याद कर रहा था। मैं निष्कर्ष निकाल रहा हूं कि जब तक मैं अपने मौजूदा ऑब्जेक्ट ढांचे पर कॉल कर सकता हूं, मुझे सावधानी से अपना 'संसाधन दृश्य' डिजाइन करने की आवश्यकता है। धन्यवाद। – paulkmoore

6

यहाँ कई घंटे से मेरा निष्कर्ष खोज और प्रतिसाददाताओं यहां से इनपुट के साथ है।इस प्रकार यदि मैं वस्तु प्राप्त करता हूं, तो सभी उप-ordinates मौजूद होना चाहिए। यह आवश्यक है कि संसाधन कैशबल है। यदि मैं ऑब्जेक्ट को लोड करता हूं (और एक ईटीएजी स्टैंप प्रदान करता हूं) तो अन्य अनुरोधकर्ताओं को आंशिक ऑब्जेक्ट प्राप्त हो सकता है जब उन्हें पूर्ण उम्मीद की जाती है। निष्कर्ष निकालें - यदि संसाधनों के रूप में उपलब्ध कराए जा रहे हैं तो वस्तुएं पूरी तरह से आबादी होनी चाहिए।

एसोसिएटेड ऑब्जेक्ट रिलेशनशिप अन्य (प्राथमिक) संसाधनों के लिंक के रूप में उपलब्ध कराए जाने चाहिए। इस तरह ऑब्जेक्ट्स एपीआई ट्रैवर्स द्वारा खोजने योग्य हैं।

इसके अलावा, ऑब्जेक्ट पदानुक्रम जो मुख्य अनुप्रयोग साइट के लिए समझ में आया है वह ऐसा नहीं हो सकता है जिसे आपको यथार्थ तरीके से कार्य करने की आवश्यकता है, लेकिन मौजूदा पदानुक्रम के साथ समस्याओं को प्रकट करने की अधिक संभावना है। ऐसा करने के बाद एपीआई को पहले विशेष रूप से विचार किए गए अधिक विशेष उपयोग मामलों की आवश्यकता हो सकती है, और विशेष संसाधनों की आवश्यकता हो सकती है।

आशा में मदद करता है कि किसी को

9

मैं Restful Obects जो उजागर के लिए मानकों है की सिफारिश करेंगे डोमेन मॉडल के शोकहारा

शोकहारा वस्तुओं का विचार एक मानक, डोमेन ऑब्जेक्ट मॉडल के लिए सामान्य RESTful इंटरफेस प्रदान करने, का निरूपण उजागर है JSON का उपयोग करके उनकी संरचना और HTTP GET, POST, PUT और DELETE का उपयोग कर डोमेन ऑब्जेक्ट इंस्टेंस के साथ इंटरैक्शन सक्षम करना।

मानक के अनुसार, यूआरआई किया जाएगा:

  • api.example.com/object/user/31
  • api.example.com/object/user/31/properties/username
  • api.example.com/object/user/31/collections/channels
  • api.example.com/object/user/31/collections/members
  • api.example.com/object/user/31/क्रियाएं/कुछ समारोह
  • api.example.com/object/user/31/actions/someFunction/invoke

वहाँ भी अन्य संसाधनों

  • api.example.com/services
  • api.example हैं।

    • वस्तु
    • सूची
    • संपत्ति (अन्य वस्तुओं के लिए लिंक की) (जो किसी भी डोमेन वस्तु या सेवा का प्रतिनिधित्व करता है): com/डोमेन-प्रकार

    विनिर्देश में कुछ प्राथमिक अभ्यावेदन को परिभाषित करता है

  • संग्रह
  • कार्रवाई
  • कार्रवाई परिणाम (आमतौर पर conta ining या तो एक वस्तु या एक सूची है, या बस प्रतिक्रिया संदेशों)
  • और भी इस तरह के घर के रूप में माध्यमिक अभ्यावेदन की एक छोटी संख्या है, और उपयोगकर्ता

यह दिलचस्प है के रूप में आपको लगता है कि पूरी तरह से अभ्यावेदन आत्म दिखाई देंगे यदि आवश्यक हो तो जेनेरिक दर्शकों को लागू करने की संभावना को खोलना।

वैकल्पिक रूप से, प्रतिनिधित्व सीधे बेस्पेक एप्लिकेशन द्वारा उपभोग किया जा सकता है।