क्या REST API कई संसाधनों को एक एकल यौगिक संसाधन के रूप में लौटा सकता है?


10

मैं एक REST API बनाने की प्रगति में हूँ और वर्तमान में, मैं निम्नलिखित समस्या का सामना कर रहा हूँ:

  • Fooपहला संसाधन है। /foo/यूआरआई के माध्यम से सीआरयूडी संचालन लागू किया जा सकता है ।
  • Barदूसरा संसाधन है। /bar/यूआरआई के माध्यम से सीआरयूडी संचालन लागू किया जा सकता है ।
  • प्रत्येक Fooशून्य या एक के साथ जुड़ा हुआ है Bar। इस कारण से कि मैं Barएक सब-सोर्स के रूप में व्यवहार नहीं करता हूं, Fooक्योंकि एक ही Barउदाहरण म्यूटेंट Fooएस के बीच साझा किया जा सकता है । इसलिए मुझे लगा कि इसके बजाय एक स्वतंत्र यूआरआई के माध्यम से इसे एक्सेस करना बेहतर है /foo/[id]/bar

मेरी समस्या यह है कि मामलों की एक महत्वपूर्ण मात्रा में, ग्राहक जो एक Fooउदाहरण के लिए पूछते हैं वे भी संबंधित Barउदाहरण में रुचि रखते हैं । वर्तमान में, इसका मतलब है कि उन्हें एक के बजाय दो प्रश्न करने होंगे। मैं एक ऐसा तरीका पेश करना चाहता हूं जिससे दोनों वस्तुओं को एक ही क्वेरी के साथ प्राप्त किया जा सके, लेकिन मुझे नहीं पता कि ऐसा करने के लिए एपीआई को कैसे मॉडल करना है। अब तक मैं क्या लेकर आया:

  • मैं इसके समान एक क्वेरी पैरामीटर पेश कर सकता हूं /foo/[id]?include_bar=true:। इस दृष्टिकोण के साथ समस्या यह है कि प्रतिक्रिया के संसाधन प्रतिनिधित्व (उदाहरण के लिए JSON संरचना) को अलग दिखने की आवश्यकता होगी (उदाहरण के लिए एक कंटेनर जैसे कि { foo: ..., bar: ... }बस क्रमबद्ध Foo), जो Fooसंसाधन को "विषम" बनाता है । मुझे नहीं लगता कि यह अच्छी बात है। क्वेरी करते समय /foo, क्लाइंट को हमेशा क्वेरी पैरामीटर की परवाह किए बिना समान संसाधन प्रतिनिधित्व (संरचना) प्राप्त करना चाहिए।
  • एक अन्य विचार एक नया रीड-ओनली समापन बिंदु पेश करना है, जैसे /fooandbar/[foo-id]। इस मामले में, यह प्रतिनिधित्व को वापस करने के लिए कोई समस्या नहीं है { foo: ..., bar: ... }, क्योंकि तब यह fooandbarसंसाधन का सिर्फ "आधिकारिक" प्रतिनिधित्व है । हालांकि, मुझे नहीं पता कि ऐसा हेल्पर एंडपॉइंट वास्तव में रैस्टफुल है (यही कारण है कि मैंने प्रश्न के शीर्षक में "कैन" लिखा है। बेशक यह तकनीकी रूप से संभव है, लेकिन मुझे नहीं पता कि यह एक अच्छा विचार है)।

तुम क्या सोचते हो? क्या कोई अन्य संभावनाएं हैं?


फू और बार के बीच संबंध के लिए शब्द क्या है? क्या आप कह सकते हैं कि बार फू का जनक है?
नाथन मेरिल 12

A Barबिना संबंधित नहीं हो सकता Foo। हालाँकि, जैसा कि मैंने ऊपर लिखा है, यह संभव है कि एकाधिक Foos समान साझा करें Bar। यह Fooएक Barसम्बद्ध के बिना बनाना संभव होना चाहिए , इसलिए मुझे नहीं लगता कि Barमाता-पिता के रूप में माना जाना चाहिए।
13

1
मुझे लगता है कि आप कुछ समस्याओं का सामना कर रहे हैं, जो कि मैंने यूआरआई में सीधे डोमेन मॉडल संबंधों का अनुवाद करके और संसाधनों को डोमेन संस्थाओं के बराबर किया है । यह ब्याज हो सकता है बाकी एपीआई हाइपरटेक्स्ट-चालित होना चाहिए । 4 बात करने के लिए विशेष ध्यान
Laiv

जवाबों:


6

एक स्तर 3 रीस्ट एपीआई आपको एक लौटाएगा Fooऔर संबंधित को इंगित करने वाला एक लिंक भी होगा Bar

GET /foo/123
<foo id="123">
  ..foo stuff..
  <link rel="bar" uri="/bar/456"/>
</foo>

फिर आप अपने एपीआई में एक "ड्रिल डाउन" सुविधा जोड़ सकते हैं जो लिंक के नेविगेशन की अनुमति देता है;

GET /foo/123?drilldown=bar
<foo id="123">
  ..foo stuff..
  <link rel="bar" uri="/bar/456">
    <bar id="456">
      ..bar stuff...
    </bar>
  </link>
</foo>

ड्रिल डाउन फीचर एपीआई के सामने बैठकर प्रतिक्रियाओं को रोक देगा। यह कॉल करने वाले को प्रतिक्रिया देने से पहले ड्रिल डाउन कॉल और विवरण भर देगा।

यह स्तर 3 REST में एक बहुत ही सामान्य बात है क्योंकि यह धीमी http पर क्लाइंट / सर्वर चैटिंग को बहुत कम करता है। जिस कंपनी के लिए मैं काम करता हूं वह इस सुविधा के साथ एक स्तर 3 REST API का उत्पादन करती है।

अपडेट: इसकी कीमत क्या है, यहां यह JSON में कैसे दिख सकता है। यह है कि हमारा एपीआई इसे कैसे तैयार करेगा। ध्यान दें कि आप लिंक आदि के लिंक खींचने के लिए अपने ड्रिल डाउन को घोंसला बना सकते हैं।

GET /foo/123?drilldown=bar

{
  "self": {
    "type": "thing.foo",
    "uri": "/foo/123=?drilldown=bar",
    "href": "http://localhost/api/foo/123?drilldown=bar"
  },
  "links": [
    {
      "rel": "bar",
      "rev": "foo",
      "type": "thing.bar",
      "uri": "/bar/456",
      "href": "http://localhost/api/bar/456"
    }
  ],
  "_bar": [
    {
      "self": {
        "type": "thing.bar",
        "uri": "/bar/456",
        "href": "http://localhost/api/bar/456"
      },
      "links": [
        {
          ..other link..
        },
        {
          ..other link..
        }
      ]
    }
  ]
}

दिलचस्प है, मैं पहले से ही यूआरआई को तंग युग्मन को हटाने के लिए हाइपरमीडिया लिंक / नियंत्रण का उपयोग कर रहा हूं, लेकिन मैंने "ड्रिल डाउन" विचार के बारे में नहीं सोचा है जो बहुत आशाजनक लगता है। एक JSON प्रतिनिधित्व कैसे दिख सकता है? फिलहाल, मेरे संसाधनों के प्रत्येक JSON प्रतिनिधित्व में एक linksसरणी है, प्रत्येक प्रविष्टि एक लिंक ऑब्जेक्ट है relऔर एक uriफ़ील्ड (आपके xml उदाहरण के समान) के साथ है। क्या मुझे प्रत्येक लिंक ऑब्जेक्ट (उदाहरण के लिए data) में तीसरा क्षेत्र जोड़ना चाहिए ? क्या कोई मानक है?
सेरन

ड्रिल डाउन वास्तव में एक आराम सुविधा नहीं है, इसलिए कोई मानक नहीं हैं (कम से कम मुझे पता है कि)।
13

कुछ प्रस्तावित मानक हैं, जैसे कि स्टेटलेस। END/hal_specification.html जो मैं अपने अनुप्रयोगों में उपयोग कर रहा हूं। यह आपके उदाहरण के बहुत करीब है।
पीट किर्कम

4

सभी प्रश्नों के 95% चाहते हैं Fooऔर साथ ही Bar, तो बस इसे वापस अंदर की Fooवस्तु है जब आप एक का अनुरोध Foo। बस एक संपत्ति जोड़ें bar(या रिश्ते के लिए कुछ और शब्द), और Barवहां वस्तु डालें । यदि संबंध मौजूद नहीं है, तो अशक्त का उपयोग करें।

मुझे लगता है कि आप इसे पछाड़ रहे हैं :)


मुझे उस नंबर (95%) के साथ नहीं आना चाहिए था, यह एक गलती थी, क्षमा करें। मैं जो कहना चाहता था वह यह था कि अनुरोधों का एक बड़ा हिस्सा एक ही समय में दोनों संसाधनों में रुचि रखता है। लेकिन अभी भी अनुरोधों की एक प्रासंगिक संख्या है जो केवल में रुचि रखते हैं Foo, और चूंकि प्रत्येक Barमेमोरी में बहुत बड़ा है (लगभग 3x-4x के आकार के आसपास Foo), Barअगर कोई क्लाइंट स्पष्ट रूप से अनुरोध नहीं करता है तो मैं वापस नहीं लौटना चाहता ।
सेरन

हम कितनी बड़ी बात कर रहे हैं? मुझे शक है कि यह सुनिश्चित करने के लिए जा रहा है कि हस्तांतरण के समय में बहुत अधिक अंतर है, और मैं गति पर एक स्वच्छ एपीआई पसंद करते हैं
नाथन मेरिल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.