बाकी एपीआई - क्या एपीआई रिटर्न नेस्टेड JSON ऑब्जेक्ट्स चाहिए?


37

जब JSON एपीआई की बात आती है तो प्रतिक्रियाओं को समतल करने और नेस्टेड JSON ऑब्जेक्ट्स से बचने के लिए यह अच्छा अभ्यास है?

एक उदाहरण के रूप में हम कहते हैं कि हमारे पास IMDb के समान एक एपीआई है, लेकिन वीडियो गेम के लिए। कुछ इकाइयाँ, गेम, प्लेटफ़ॉर्म, ESRBRating और GamePlatformMap हैं, जो गेम्स और प्लेटफ़ॉर्म को मैप करते हैं।

कहते हैं कि आप अनुरोध / खेल / 1 जो आईडी 1 के साथ खेल लाने के लिए और यह खेल वस्तु को प्लेटफार्मों के साथ देता है और नेस्ट्रेस्टिंग नेस्टेड है।

{
  "id": 1,
  "title": "Game A",
  "publisher": "Publisher ABC",
  "developer": "Developer DEF",
  "releaseDate": "2015-01-01",
  "platforms": [
    {"id":1,"name":"Xbox"},
    {"id":2,"name":"Playstation"}
  ],
  "esrbRating": {
    "id": 1,
    "code": "E",
    "name": "Everyone"
  }
}

यदि आप JPA / हाइबरनेट जैसी किसी चीज़ का उपयोग कर रहे हैं तो यह FETCH.EAGER पर सेट होने पर स्वचालित रूप से आपके लिए ऐसा कर सकता है।

अन्य विकल्प केवल एपीआई और अधिक अंत बिंदुओं को जोड़ना है।

उस स्थिति में जब / खेल / 1 का अनुरोध किया जाता है, तो बस खेल वस्तु वापस आ जाती है।

{
  "id": 1,
  "title": "Game A",
  "publisher": "Publisher ABC",
  "developer": "Developer DEF",
  "releaseDate": "2015-01-01",
}

यदि आप प्लेटफ़ॉर्म और / या ESRBRating चाहते हैं, तो आपको निम्नलिखित कॉल करने होंगे:

/ खेल / 1 / मंच / खेल / 1 / esrb

इस विधि से ऐसा लगता है कि यह संभावित रूप से सर्वर को कई और कॉल जोड़ सकता है, जो क्लाइंट को डेटा की जरूरत है और जब उन्हें इसकी आवश्यकता हो, उसके आधार पर।

एक अंतिम विचार था कि मेरे पास ऐसा कुछ है जहां आप इस तरह से लौट आएंगे।

{
  "id": 1,
  "title": "Game A",
  "publisher": "Publisher ABC",
  "developer": "Developer DEF",
  "releaseDate": "2015-01-01",
  "platforms": ["Xbox","Playstation"]
}

हालाँकि यह मानता है कि उन्हें आईडी या जो भी अन्य जानकारी उन प्लेटफ़ॉर्म ऑब्जेक्ट्स से जुड़ी हो सकती है, की आवश्यकता नहीं है।

मैं सामान्य तौर पर पूछ रहा हूं कि आपके JSON ऑब्जेक्ट्स को आपके API से वापस लाने का सबसे अच्छा तरीका क्या है। क्या आपको अपनी संस्थाओं के करीब रहने की कोशिश करनी चाहिए, या डोमेन ऑब्जेक्ट्स या डेटा ट्रांसफर ऑब्जेक्ट्स का उपयोग करना ठीक है? मैं समझता हूं कि तरीकों में व्यापार से अधिक लाभ होगा, या तो डेटा एक्सेस लेयर पर अधिक काम करना होगा या क्लाइंट के लिए अधिक काम करना होगा।

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


6
क्या आपत्ति है, यदि कोई है, तो क्या आपके पास एम्बेडेड ऑब्जेक्ट्स हैं? अलग-अलग समापन बिंदुओं से व्यक्तिगत रूप से एम्बेडेड ऑब्जेक्ट्स को वापस करना बहुत खराब परेशान करने वाला है (धीमी गति से उल्लेख नहीं करना)।
रॉबर्ट हार्वे

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

3
इसका उत्तर इस बात पर निर्भर करता है कि आप डोमेन ऑब्जेक्ट, DTO, ViewModel ऑब्जेक्ट, या KitchenSink ऑब्जेक्ट वापस करना चाहते हैं। आप जिस वस्तु को वापस कर रहे हैं, वह आपके एप्लिकेशन की आवश्यकता से निर्धारित होने वाली है, और कहा गया है कि इंटरनेट पर वस्तु कैसे व्यवहार करती है। उदाहरण: यदि आप एक चालान से डेटा के साथ एक वेब पेज को भरने की कोशिश कर रहे हैं, तो बहुत संभव है कि आप एक ऐसी वस्तु वापस करने जा रहे हैं जिसमें आपको अपनी जरूरत की सभी चीजें मिलेंगी (जब तक कि आप लाइन आइटम में AJAX की योजना, या ऐसा कुछ नहीं करते)।
रॉबर्ट हार्वे

यह ऐसा मामला है जब आप एक खेल का अनुरोध करते हैं, तो आप संभवतः शैलियों, प्लेटफार्मों और ESRBRating जानना चाहते हैं। यह समझ आता है। एक जावा परिप्रेक्ष्य से डिजाइन के संदर्भ में क्या आप एंटिटी पैकेज होने की सिफारिश करेंगे जिसमें जेपीए का प्रवेश है, और फिर एक डोमेन पैकेज जो व्यावसायिक वस्तुओं / डीटीओ है जो उपयोगकर्ता को वापस कर रहा है?
ग्रेफॉक्स

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

जवाबों:


11

एक अन्य विकल्प (HATEOAS का उपयोग करके)। यह सरल है, अधिकतर व्यवहार में आप HATEOAS के उपयोग के आधार पर json में लिंक टैग जोड़ते हैं।

http://api.example.com/games/1:

{
  "id": 1,
  "title": "Game A",
  "publisher": "Publisher ABC",
  "developer": "Developer DEF",
  "releaseDate": "2015-01-01",
  "platforms": [
    {"_self": "http://api.example.com/games/1/platforms/53", "name": "Playstation"},
    {"_self": "http://api.example.com/games/1/platforms/34", "name": "Xbox"},
  ]
}

http://api.example.com/games/1/platforms/34:

{
  "id": 34,
  "title": "Xbox",
  "publisher": "Microsoft",
  "releaseDate": "2015-01-01",
  "testReport": "http://api.example.com/games/1/platforms/34/reports/84848.pdf",
  "forms": [
    {"type": "edit", "fields: [] },
  ]
}

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

तकनीकी कार्यान्वयन में कैशिंग शामिल हो सकता है। आप गेम ऑब्जेक्ट में प्लेटफ़ॉर्म लिंक और नामों को कैश कर सकते हैं और प्लेटफार्मों एपीआई को लोड किए बिना इसे तुरंत भेज सकते हैं। फिर जब आवश्यक हो आप इसे लोड कर सकते हैं।

आप उदाहरण के लिए देखते हैं कि मैंने कुछ फॉर्म जानकारी जोड़ी है। मैंने आपको यह दिखाने के लिए कि एक विस्तृत json ऑब्जेक्ट में बहुत अधिक जानकारी हो सकती है जितना कि आप खेलों की सूची में लोड करना चाहते हैं।


मुझे नहीं लगता कि तकनीकी रूप से HATEOS है क्योंकि कोई राज्य नहीं है।
रिबॉल्डएडिएडी

हाँ, इस प्रक्रिया पर सटीक शब्द नहीं है। सामान्य तौर पर HATEOS का उपयोग बाकी API में लिंक करने के लिए किया जा रहा है, लेकिन मैं मानता हूं कि इसे राज्य के साथ भी करना है। हालांकि कार्यान्वयन का विचार समान होगा। यहाँ आप एक उदाहरण के द्वारा इसका उपयोग कैसे किया जा सकता है, इसके बारे में थोड़ा और देखते हैं: stormpath.com/blog/linking-and-resource-expansion-rest-api-tips
Luc Franken

हालांकि यह एक अच्छा विचार है!
रिबल्डएडिएडी

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

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

16

यह उन मूल प्रश्नों में से एक है जब यह REST API डिज़ाइन की बात आती है। हर डिजाइनर पहले दिन खुद से यह सवाल पूछता है। क्षमा करें, लेकिन उत्तर "यह निर्भर करता है" है। प्रत्येक दृष्टिकोण में पेशेवरों और विपक्ष हैं और आपको बस एक निर्णय लेने और इसके साथ जाने की आवश्यकता होगी।


10
यह बिल्कुल भी मददगार नहीं है। ओपी खुद जानता था कि "यह निर्भर करता है और प्रत्येक दृष्टिकोण में पेशेवरों और विपक्ष हैं"। आपको यह बताना चाहिए कि यह किन चीजों पर निर्भर करता है या बहुत कम से कम कुछ उदाहरण देता है।
प्रतीक सिंघल

5

मैं यहाँ प्रस्तुत किया गया दूसरा दृष्टिकोण https://www.slideshare.net/stormpath/rest-jsonapis

संक्षेप में, नेस्टेड संसाधन को मूल संसाधन में लिंक के रूप में शामिल करें, इस बीच, मूल समापन बिंदु में एक विस्तारित पैरामीटर प्रदान करें।

मेरी राय में, यह एक ऐसा तरीका है जो ज्यादातर मामलों में कुशल और लचीला है।


2
मुझे यह तरीका पसंद है। किसी को भी आश्चर्य होता है, यह लिंक स्लाइड शो में SLIDE 57 से शुरू होता है।
एडम प्लोचर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.