2011-08-18 12 views
154

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

उदाहरण के लिए मेरे पास कॉमिकबुक के लिए संसाधन है। कॉमिकबुक में लेखक, अंक संख्या, दिनांक इत्यादि जैसे सभी प्रकार के गुण हैं

एक कॉमिक बुक में 1..एन कवर शामिल हैं। ये कवर जटिल वस्तुएं हैं। उनमें कवर, कलाकार, तिथि, और यहां तक ​​कि कवर की आधार 64 एन्कोडेड छवि के बारे में बहुत सारी जानकारी होती है।

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

मेरा वृत्ति एक संसाधन को कवर करना है और कॉमिकबुक में कवर शामिल हैं। तो अब कवर एक यूआरआई है। कॉमिक बुक काम पर जाएं, विशाल कवर संसाधन के बजाय हम प्रत्येक कवर के लिए एक यूआरआई वापस भेजते हैं और ग्राहक कवर संसाधनों को पुनर्प्राप्त कर सकते हैं क्योंकि उन्हें उनकी आवश्यकता होती है।

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

कवर संसाधन शायद किसी भी मामले में आवश्यक है क्योंकि मुझे यकीन है कि एक ग्राहक के रूप में मैं कुछ मामलों में कवर दिशा को संबोधित करना चाहता हूं। इसलिए आश्रित संसाधन के आकार के बावजूद समस्या सामान्य रूप में मौजूद है। सामान्य रूप से आप क्लाइंट को मजबूर किए बिना जटिल संसाधनों को कैसे संभालते हैं कि वे "संसाधन" कैसे बनाते हैं?

+0

[रीस्टफुल सेवा डिस्कवरी] का उपयोग कर रहा है (http://barelyenough.org/blog/2008/01/restful-service-discovery-and-description/) समझ में आता है? – treecoder

+1

मैं हेटाओस का पालन करने की कोशिश कर रहा हूं, जो मेरे दिमाग में ऐसा कुछ उपयोग करने के लिए काउंटर चलाता है लेकिन मैं एक नज़र डालूंगा। – jgerman

+0

एक ही भावना में अलग सवाल। हालांकि स्वामित्व आपके प्रस्तावित समाधान (प्रश्न में से एक) से अलग है। http://stackoverflow.com/questions/20951419/what-are-best-practices-for-rest-nested-resources – Wes

उत्तर

37

संसाधनों के रूप में कवर का इलाज निश्चित रूप से आरईएसटी, विशेष रूप से हैटॉस की भावना में है। तो हाँ, GEThttp://example.com/comic-books/1 के लिए अनुरोध आपको पुस्तक 1 ​​का प्रतिनिधित्व देगा, जिसमें कवर के लिए यूआरआई के एक सेट सहित संपत्तियां होंगी। अब तक सब ठीक है।

आपका प्रश्न हास्य पुस्तक निर्माण से निपटने का तरीका है। यदि आपके व्यवसाय नियम था कि एक किताब 0 या अधिक कवर होता है, तो आप कोई समस्या नहीं है:

POST http://example.com/comic-books 
coverless हास्य पुस्तक डेटा एक नया हास्य पुस्तक बना सकते हैं और सर्वर उत्पन्न आईडी वापस आ जाएगी साथ

(कहना देता है इकाई शरीर में कवर के साथ

POST http://example.com/comic-books/8/covers 

: इसे वापस 8) के रूप में आता है, और अब आप ऐसा है जैसे कि यह करने के लिए कवर जोड़ सकते हैं।

अब आपके पास एक अच्छा सवाल है जो तब होता है जब आपका व्यवसाय नियम कहता है कि हमेशा कम से कम एक कवर होना चाहिए।

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

  2. प्राथमिक, या प्रारंभिक, या पसंदीदा, या अन्यथा नामित कवर की धारणा को परिभाषित करें। यह एक मॉडलिंग हैक की संभावना है, और यदि आपने ऐसा किया है तो यह एक तकनीक फिट करने के लिए आपके ऑब्जेक्ट मॉडल (आपके वैचारिक या व्यावसायिक मॉडल) को ट्वीव करना होगा। एक अच्छा विचार नहीं है।

आपको इन दो विकल्पों को आसानी से कवरलेस कॉमिक्स की अनुमति देने के खिलाफ वजन करना चाहिए।

आपके द्वारा चुने गए तीन विकल्पों में से कौन सा विकल्प लेना चाहिए? नहीं अपनी स्थिति के बारे में बहुत ज्यादा जानते हुए भी, लेकिन सामान्य 1..N निर्भर संसाधन सवाल का जवाब, मैं कहूंगा कि:

  • आप अपने RESTful सेवा परत के लिए 0..N के साथ जा सकते हैं महान। यदि आपके कम से कम एक की आवश्यकता है तो शायद आपके रीस्टफुल एसओए के बीच एक परत आगे की व्यापार बाधा को संभालने में सक्षम हो सकती है। (यह सुनिश्चित नहीं है कि यह कैसा दिखता है लेकिन यह खोज के लायक हो सकता है .... अंतिम उपयोगकर्ता आमतौर पर एसओए नहीं देखते हैं।)

  • यदि आपको बस एक मॉडल बनाना चाहिए। एन बाधा, तो खुद से पूछें कि क्या कवर केवल धूर्त संसाधन हो सकते हैं, दूसरे शब्दों में, वे कॉमिक किताबों के अलावा अन्य चीजों पर मौजूद हो सकते हैं। अब वे आश्रित संसाधन नहीं हैं और आप उन्हें पहले बना सकते हैं और अपने पोस्ट में यूआरआई आपूर्ति कर सकते हैं जो हास्य किताबें बनाता है।

  • यदि आपको आवश्यकता है 1. एन और कवर निर्भर रहते हैं, तो पदों में प्रतिनिधित्व रखने और इसे प्राप्त करने के लिए बस अपनी वृत्ति को आराम दें, या उन्हें वही बनाएं।

अंतिम आइटम इतना तरह समझाया गया है:

<comic-book> 
    <name>...</name> 
    <edition>...</edition> 
    <cover-image>...BASE64...</cover-image> 
    <cover-image>...BASE64...</cover-image> 
    <cover>...URI...</cover> 
    <cover>...URI...</cover> 
</comic-book> 

जब आप पोस्ट आप यदि आप उन्हें है (अन्य पुस्तकों से उधार), लेकिन यह भी एक या अधिक प्रारंभिक छवियों में डाल मौजूदा यूआरआई अनुमति देते हैं। यदि आप कोई पुस्तक बना रहे हैं और आपकी इकाई में प्रारंभिक कवर-छवि नहीं है, तो 40 9 या इसी तरह की प्रतिक्रिया दें। प्राप्त करने पर आप यूआरआई वापस कर सकते हैं ..

तो मूल रूप से आप पोस्ट को अनुमति दे रहे हैं और "समान होने" के लिए प्रस्तुतियां प्राप्त कर रहे हैं, लेकिन आप बस जीईटी पर कवर-छवि "उपयोग" न करें और न ही पोस्ट पर कवर करें। उम्मीद है कि समझ में आता है।

58

@ray, उत्कृष्ट चर्चा

@jgerman, मत भूलना सिर्फ इसलिए कि यह बाकी है, इसका मतलब यह नहीं है कि संसाधनों पोस्ट से पत्थर में सेट किया जाना है।

संसाधन के किसी दिए गए प्रतिनिधित्व में शामिल करने के लिए आप क्या चुनते हैं वह आपके ऊपर है।

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

कवर का आपका विशिष्ट मामला थोड़ा अधिक जटिल है कि वास्तव में एक कवर को कॉमिक बुक और वीज़ा बनाम की आवश्यकता होती है।

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

यह ट्यूटोरियल क्रॉस-रेफरेंस किए गए संसाधनों का एक बड़ा उदाहरण प्रदान करता है। http://www.peej.co.uk/articles/restfully-delicious.html

स्वचालित रूप से जेनरेट किए गए डेटा के लिए यह सबसे आम पैटर्न है। उदाहरण के लिए, आप नए संसाधन के लिए यूआरआई, आईडी, या निर्माण तिथि पोस्ट नहीं करते हैं, क्योंकि ये सर्वर द्वारा उत्पन्न होते हैं। और फिर भी, जब आप नया संसाधन वापस प्राप्त करते हैं तो आप यूआरआई, आईडी या निर्माण तिथि पुनर्प्राप्त कर सकते हैं।

बाइनरी डेटा के आपके मामले में एक उदाहरण। उदाहरण के लिए, आप बाइनरी डेटा को बाल संसाधन के रूप में पोस्ट करना चाहते हैं। जब आप मूल संसाधन प्राप्त करते हैं तो आप उन बाल संसाधनों का प्रतिनिधित्व उसी बाइनरी डेटा के रूप में कर सकते हैं, या यूआरआई जो द्विआधारी डेटा का प्रतिनिधित्व करते हैं।

फॉर्म & पैरामीटर संसाधनों के HTML प्रस्तुतियों से पहले से ही अलग हैं। एक बाइनरी/फ़ाइल पैरामीटर पोस्ट करना जिसके परिणामस्वरूप यूआरएल एक खिंचाव नहीं है।

जब आप किसी नए संसाधन (/ कॉमिक-बुक/न्यू) के लिए फॉर्म प्राप्त करते हैं, या संसाधन (/ कॉमिक-बुक/0/एडिट) संपादित करने के लिए फॉर्म प्राप्त करते हैं, तो आप फॉर्म-विशिष्ट प्रतिनिधित्व के लिए पूछ रहे हैं संसाधन का। यदि आप संसाधन-प्रकार "एप्लिकेशन/एक्स-www-form-urlencoded" या "मल्टीपार्ट/फॉर्म-डेटा" के साथ संसाधन संग्रह में पोस्ट करते हैं, तो आप सर्वर को उस प्रकार के प्रतिनिधित्व को सहेजने के लिए कह रहे हैं। सर्वर HTML प्रतिनिधित्व के साथ प्रतिक्रिया दे सकता है जो सहेजा गया था, या जो भी हो।

आप एक एपीआई या इसी तरह के प्रयोजनों के लिए संसाधन संग्रह में पोस्ट करने के लिए एचटीएमएल, एक्सएमएल, या जेएसओएन प्रस्तुति की अनुमति भी दे सकते हैं।

कॉमिक बुक के बाद पोस्ट किए गए खाता कवरों को ध्यान में रखते हुए, आपके संसाधनों और वर्कफ़्लो का प्रतिनिधित्व करना भी संभव है, लेकिन कॉमिक पुस्तकों को कवर करने की आवश्यकता है। निम्नानुसार उदाहरण।

  • की अनुमति देता है देरी कवर निर्माण
  • की अनुमति देता है के लिए आवश्यक कवर के साथ हास्य पुस्तक सृजन
  • की अनुमति देता है कवर पार संदर्भित
  • की अनुमति देता है कई कवर
  • बनाएं मसौदा हास्य पुस्तक
  • मसौदा हास्य पुस्तक बनाएं होने के लिए कवर
  • ड्राफ्ट कॉमिक बुक
प्रकाशित करें

GET/comic-books
=> 200 ठीक है, सभी हास्य पुस्तकें प्राप्त करें।

प्राप्त करें/कॉमिक-बुक/0
=> 200 ठीक है, कवर के साथ कॉमिक बुक (आईडी: 0) प्राप्त करें (/ कवर/1,/कवर/2)।

प्राप्त करें/कॉमिक-बुक/0/कवर
=> 200 ठीक है, कॉमिक बुक (आईडी: 0) के लिए कवर प्राप्त करें।

प्राप्त/कवर
=> 200 ठीक है, सभी कवर प्राप्त करें।

प्राप्त/कवर/1
=> 200 ठीक है, कॉमिक बुक (/ कॉमिक-बुक/0) के साथ कवर (आईडी: 1) प्राप्त करें। (: पोस्ट/ड्राफ्ट-कॉमिक पुस्तकों फार्म)

प्राप्त/कॉमिक पुस्तकों/नई
=> 200 ठीक, प्रपत्र हास्य पुस्तक बनाने के लिए प्राप्त करें।

पोस्ट/ड्राफ्ट-कॉमिक पुस्तकों
title = foo
लेखक = बू
प्रकाशक = goo
प्रकाशित = 2011-01-01
=> 302 मिला, स्थान:/ड्राफ्ट-हास्य किताबें/3, ड्राफ्ट कॉमिक बुक (आईडी: 3) ड्राफ्ट (बाइनरी) के साथ रीडायरेक्ट करें।

प्राप्त करें/ड्राफ्ट-कॉमिक-किताबें/3
=> 200 ठीक है, ड्राफ्ट कॉमिक बुक (आईडी: 3) को कवर के साथ प्राप्त करें।

प्राप्त/ड्राफ्ट-कॉमिक पुस्तकों/3/
=> 200 ठीक शामिल किया गया है, जाओ मसौदा हास्य पुस्तक के लिए कवर (/ ड्राफ्ट-कॉमिक बुक/3)।

प्राप्त/ड्राफ्ट-कॉमिक पुस्तकों/3/शामिल किया गया/नई
=> 200 ठीक, मसौदा हास्य पुस्तक के लिए कवर बनाने के लिए प्रपत्र प्राप्त करें (/ ड्राफ्ट-कॉमिक बुक/3) (प्रपत्र: पोस्ट/draft- हास्य किताबें/3/कवर)।/ड्राफ्ट-कॉमिक पुस्तकों/3/कवर, नई यहां रीडायरेक्ट करें:

पोस्ट/ड्राफ्ट-कॉमिक पुस्तकों/3/
cover_type = सामने
cover_data = (बाइनरी)
=> 302 मिला, स्थान को शामिल किया गया ड्राफ्ट कॉमिक बुक (/ ड्राफ्ट-कॉमिक-बुक/3/कवर/1) के लिए कवर।

प्राप्त/ड्राफ्ट-कॉमिक पुस्तकों/3/प्रकाशित
=> 200 ठीक, मसौदा हास्य पुस्तक (आईडी: 3) प्रकाशित करने के लिए प्रपत्र जाओ (प्रपत्र: पोस्ट/प्रकाशित-हास्य किताबें)।

पोस्ट/प्रकाशित-कॉमिक पुस्तकों
title = foo
लेखक = बू
प्रकाशक = goo
प्रकाशित = 2011-01-01
cover_type = सामने
cover_data = (बाइनरी)
= > 302 मिला, स्थान:/कॉमिक-किताबें/3, कवर के साथ प्रकाशित कॉमिक बुक (आईडी: 3) पर रीडायरेक्ट करें।

+0

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

+3

@GaryMcGill उनके उदाहरण में,/ड्राफ्ट-कॉमिक-बुक/3/प्रकाशित केवल एक HTML फॉर्म लौटाता है (किसी भी डेटा को संशोधित नहीं करता है)। –

+0

@ ओलिवियर सही है। प्रकाशित शब्द यह बताता है कि फ़ॉर्म क्या करता है। हालांकि, क्योंकि आप HTTP विधियों तक सीमित क्रियाएं रखना चाहते हैं, इसलिए आपको प्रकाशित कॉमिक पुस्तकों के लिए संसाधन पर पोस्ट करना चाहिए। ... यदि यह एक वेबसाइट थी, तो आपको कुछ प्रकाशित करने के लिए फॉर्म के लिए यूआरआई की आवश्यकता हो सकती है। ... हालांकि, अगर कॉमिक बुक पेज पर प्रकाशित कार्रवाई केवल एक ही बटन थी, तो वह सिंगल-बटन फॉर्म सीधे/प्रकाशित कॉमिक-बुक यूआरआई पर पोस्ट कर सकता था। – Alex

संबंधित मुद्दे