RESTful API में प्रतिक्रिया के रूप में किसी सरणी को वापस करने का सबसे अच्छा तरीका क्या है?


40

मान लें कि हमारे पास इस तरह के संसाधन हैं,

book:
    type: object
    properties:
        author: {type: string}
        isbn: {type: string}
        title: {type: string}

books:
    type: array
    items: book

इसलिए, जब कोई GETपुस्तक संसाधन पर बनाता है , तो हम निम्नलिखित को वापस करेंगे

[{"author": "Dan Brown", "isbn": "123456", "title": "Digital Fortress"},
 {"author": "JK Rowling", "isbn": "234567", "title": "Harry Potter and the Chamber of Secrets"}]

मैंने काम पर किसी से सुना है कि अनुशंसित REST अभ्यास हमेशा JSON ऑब्जेक्ट्स के रूप में प्रतिक्रियाएं देने के लिए है, जिसका अर्थ होगा कि हमारे स्कीमा booksइस तरह दिखेंगे,

books:
    type: object
    properties:
        list:
            type: array
            items: book

तो, अब, प्रतिक्रिया इस तरह दिखाई देगी,

{
    "list": [{"author": "Dan Brown", "isbn": "123456", "title": "Digital Fortress"},
             {"author": "JK Rowling", "isbn": "234567", "title": "Harry Potter and the Chamber of Secrets"}]
}

इनमें से कौन सा सबसे अच्छा REST अभ्यास है?


1
क्या JSON RESTful है? आप निश्चित रूप से HTML वापस करना चाहिए
इवान

3
@ इवान: पेलोड कोई फर्क नहीं पड़ता। यही MIME प्रकार हैं।
रॉबर्ट हार्वे

1
न ही रीस्ट के लिए सबसे अच्छा अभ्यास कर रहे हैं। REST HATEOAS से बना है, जिसका अर्थ है आपके API की खोज। HAL या JSON-LD देखें।
फ्लोरियन मार्गाइन

Json-ld: WCF
Ewan

किसी वस्तु के अंदर रैपिंग JSON एरेज़ को मैंने जो पढ़ा है, वह पुराने ब्राउज़रों में रिपोर्ट की गई भेद्यता के खिलाफ रक्षात्मक उपाय है - haacked.com/archive/2009/06/25/json-hijacking.aspx । ऐसा लगता है कि आज के आधुनिक समय में तय हो गया है। सॉरी से बेहतर सुरक्षित मुझे लगता है ..
गिशु

जवाबों:


35

व्यवहार में दूसरा विकल्प सबसे अच्छा अभ्यास है। इसका कारण यह है कि जब आप सिर्फ एक सरणी लौटाते हैं तो आप संसाधन का विस्तार नहीं कर सकते हैं।

उदाहरण के लिए: यदि आपको उन सभी रिकॉर्डों की गिनती जोड़ने की आवश्यकता है जो आप पहले से ही एरे दृष्टिकोण के साथ कर रहे हैं।

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

उदाहरण के लिए: मान लीजिए कि कोई डेवलपर सूची और विवरण पृष्ठ दिखाने के लिए आपके एपीआई का उपयोग करने के लिए सामान्य कोड लिखता है। वह अपवाद का निर्माण नहीं करना चाहता है क्योंकि कभी-कभी यह एक सरणी है और कभी-कभी यह एक सूची संपत्ति के साथ एक वस्तु है।

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


3
+1 "डेटा के बारे में वास्तविक होने" के लिए (और अभी भी पहचानते हुए कि REST के लिए अधिक तकनीकी, अधिक सटीक परिभाषा है)।
Threed

8

दोनों

[{"author": "Dan Brown", "isbn": "123456", "title": "Digital Fortress"},{"author": "JK Rowling", "isbn": "234567", "title": "Harry Potter and the Chamber of Secrets"}]

तथा

{
    "list": [{"author": "Dan Brown", "isbn": "123456", "title": "Digital Fortress"},
         {"author": "JK Rowling", "isbn": "234567", "title": "Harry Potter and the Chamber of Secrets"}]
}

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

बेस्ट रीस्ट प्रैक्टिस? एपीआई को हेडर में जो कुछ भी सेट करना है, उसे उचित प्रतिक्रिया देनी चाहिए, और अच्छा प्रलेखन भी।


7

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

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

REST का आपके JSON स्कीमा से कोई लेना-देना नहीं है। या तो स्कीमा स्वीकार्य है, एक अन्य दृष्टिकोण से।


9
क्या इस सवाल का जवाब है? मैंने इसे "क्या मुझे एक json सरणी या रूट के रूप में एक json ऑब्जेक्ट का उपयोग करना चाहिए?" के रूप में पढ़ा। दोनों को jars parsers के साथ पार्स किया जा सकता है, इसलिए आपका जवाब उन्हें निर्णय लेने में मदद नहीं करता है।
कोडइन्चौस

फिर इससे कोई फर्क नहीं पड़ता। मैंने अपना उत्तर अपडेट कर दिया है।
रॉबर्ट हार्वे

यदि हम REST के बारे में बात कर रहे हैं, तो स्कीमा तब तक मायने नहीं रखता है जब तक कि यह केवल प्रतिक्रिया के आधार पर आगे के संसाधनों की खोज और हेरफेर के लिए हाइपरमेडिया नियंत्रण प्रदान करने में सक्षम हो और कोई अन्य नहीं, आउट-ऑफ-बैंड जानकारी ... जो ओपी द्वारा उल्लिखित कोई भी प्रारूप ऐसा प्रतीत नहीं होता है।
toniedzwiedz 13

...and if you're using JavaScript, you don't even need a parser since JavaScript understands it natively.खैर, हाँ और नहीं। JSON जावास्क्रिप्ट का एक सबसेट है, लेकिन evalतुरंत एक पार्सर का उपयोग करने के बजाय कॉल करना आपको "JSON" के लिए असुरक्षित बनाता है जिसमें दुर्भावनापूर्ण कोड होता है, और पार्स करना सबसे अधिक संभावना है, evalवैसे भी किसी भी तरह से अधिक कुशल है ।
डोभाल

5

एक एकल अर्थहीन कुंजी "सूची" के साथ एक शब्दकोश और एक सरणी मान व्यर्थ है - इसके बजाय एक सरणी लौटाएं।

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

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


5

दूसरा विकल्प सुरक्षा कारणों से भी पसंदीदा तरीका है। पुराने ब्राउज़रों में एक सुरक्षा भेद्यता होती है जो वेब पेज पर अन्य जावास्क्रिप्ट कोड को आपके डेटा को चोरी करने की अनुमति देती है यदि यह JSON सरणी के रूप में वापस आ जाता है। इसलिए ऐतिहासिक रूप से सबसे अच्छा अभ्यास JSON सरणियों को वापस नहीं करना था। वास्तव में, कुछ ऐसे फ्रेमवर्क थे जिनके "json-ify" फंक्शन को डिफ़ॉल्ट रूप से विकल्प 2 चुनता है जब आप किसी ऐरे में पास होते हैं।

https://stackoverflow.com/questions/3503102/what-are-top-level-json-arrays-and-why-are-they-a-security-risk

http://ejohn.org/blog/re-securing-json/


1

दोनों ही json हैं और REST का पालन करते हैं। मैं आपके मामलों की सूची में पुस्तकों के लिए प्रतिक्रिया को अधिक वर्णनात्मक बनाऊंगा। या इस तरह का कुछ :

{ "responceObject" : {

   results : 2,

    "Books": [
        {"author": "Dan Brown", "isbn": "123456", "title": "Digital Fortress"},
        {"author": "JK Rowling", "isbn": "234567", "title": "Harry Potter and the Chamber of Secrets"}
    ]

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