मुझे JSON दस्तावेज़ों के संग्रह ( CouchDB या Persevere ) के लिए एक सीधा REST इंटरफ़ेस को उजागर करने में दिलचस्पी है । समस्या यह है कि GET
अगर संग्रह बड़ा है तो संग्रह रूट पर संचालन को कैसे संभालना है।
एक उदाहरण के रूप में, मैं दिखा रहा हूँ कि मैं StackOverflow की Questions
तालिका को उजागर कर रहा हूँ, जहाँ प्रत्येक पंक्ति एक दस्तावेज़ के रूप में उजागर होती है (यह नहीं कि आवश्यक रूप से ऐसी कोई तालिका हो, 'दस्तावेजों' के एक बड़े संग्रह का एक ठोस उदाहरण)। संग्रह पर उपलब्ध कराया जाएगा /db/questions
सामान्य CRUD एपीआई के साथ GET /db/questions/XXX
, PUT /db/questions/XXX
, POST /db/questions
नाटक में है। संपूर्ण संग्रह को प्राप्त करने का मानक तरीका है, GET /db/questions
लेकिन यदि वह प्रत्येक पंक्ति को JSON ऑब्जेक्ट के रूप में डंप करता है, तो आपको सर्वर के हिस्से पर एक बहुत बड़ा डाउनलोड और बहुत सारा काम मिलेगा।
समाधान, निश्चित रूप से, पेजिंग है। Dojo ने इस समस्या को अपने JsonRestStore में Range
कस्टम रेंज यूनिट के साथ हेडर का उपयोग करने के एक चतुर RFC2616-संगत विस्तार के माध्यम से हल किया है items
। नतीजा यह है 206 Partial Content
कि केवल अनुरोधित सीमा देता है। क्वेरी पैरामीटर पर इस दृष्टिकोण का लाभ यह है कि यह क्वेरी स्ट्रिंग को छोड़ देता है ... क्वेरीज़ (उदाहरण के लिए GET /db/questions/?score>200
या किसी चीज़, और हाँ जो एन्कोडेड होगी %3E
)।
यह दृष्टिकोण मेरे इच्छित व्यवहार को पूरी तरह से कवर करता है। समस्या यह है कि RFC 2616 निर्दिष्ट करता है कि 206 प्रतिक्रिया (जोर मेरा) पर:
अनुरोध एक रेंज हेडर फ़ील्ड (शामिल होना आवश्यक है अनुभाग 14.35 ) वांछित सीमा का संकेत है, और एक तो रेंज हेडर फ़ील्ड (शामिल हो सकता है अनुभाग 14.27 अनुरोध सशर्त बनाने के लिए)।
यह हेडर के मानक उपयोग के संदर्भ में समझ में आता है, लेकिन एक समस्या है क्योंकि मैं चाहूंगा कि 206 प्रतिसाद होना भोले-भाले ग्राहकों / यादृच्छिक लोगों को संभालने के लिए डिफ़ॉल्ट होना चाहिए।
मैं एक समाधान की तलाश में RFC पर विस्तार से जा चुका हूं, लेकिन अपने समाधान से नाखुश हूं और एसओ की समस्या पर दिलचस्पी लेता हूं।
मेरे द्वारा लिए गए विचार:
- हेडर के
200
साथ लौटेंContent-Range
! - मुझे नहीं लगता कि यह गलत है, लेकिन मैं पसंद करूंगा कि यदि एक अधिक स्पष्ट संकेतक है कि प्रतिक्रिया केवल आंशिक सामग्री है। - रिटर्न
400 Range Required
- आवश्यक हेडर के लिए एक विशेष 400 प्रतिक्रिया कोड नहीं है, इसलिए डिफ़ॉल्ट त्रुटि का उपयोग करना और हाथ से पढ़ना है। यह वेब ब्राउज़र (या रेसी जैसे कुछ अन्य क्लाइंट) के माध्यम से अन्वेषण को और अधिक कठिन बना देता है। - एक क्वेरी पैरामीटर का उपयोग करें - मानक दृष्टिकोण, लेकिन मैं क्वेरीज़ को ला पर्सिविए की अनुमति देने की उम्मीद कर रहा हूं और यह क्वेरी नेमस्पेस में कटौती करता है।
- अभी लौटो
206
! - मुझे लगता है कि ज्यादातर ग्राहक बाहर नहीं होंगे, लेकिन मैं RFC में MUST के खिलाफ नहीं जाऊंगा - कल्पना बढ़ाओ! रिटर्न
266 Partial Content
- बिल्कुल 206 की तरह व्यवहार करता है, लेकिन एक अनुरोध के जवाब में है जिसमेंRange
हेडर नहीं होना चाहिए । मुझे लगता है कि 266 इतना अधिक है कि मुझे टक्कर के मुद्दों में नहीं चलना चाहिए और यह मेरे लिए समझ में आता है, लेकिन मैं इस बारे में स्पष्ट नहीं हूं कि यह वर्जित माना जाता है या नहीं।
मुझे लगता है कि यह एक बहुत ही आम समस्या है और मैं इसे वास्तव में इस तरह से देखना चाहता हूं ताकि मैं या कोई और पहिया को फिर से स्थापित न कर पाए।
जब संग्रह बड़ा होता है तो HTTP के माध्यम से पूर्ण संग्रह को उजागर करने का सबसे अच्छा तरीका क्या है?
Range = "Range" ":" ranges-specifier
कि उपकरण में बाद कहां है ।ietf.org/html/rfc2616#section-14.35.1 को केवल "बाइट-रेंज- स्पेसियर " के रूप में वर्णित किया गया है, जिसे "बाइट्स-यूनिट" से शुरू करना चाहिए जिसे स्ट्रिंग "बाइट्स" के रूप में परिभाषित किया गया है। "।
Content-Range
हैडर शरीर पर लागू होता है (जब डाउनलोड प्रतिक्रिया के लिए जब बड़ी फ़ाइलों आदि को अपलोड करने के अनुरोध के साथ इस्तेमाल किया जा सकता है, या)। Range
हैडर एक निश्चित सीमा अनुरोध करने के लिए प्रयोग किया जाता है। 206
जब Range
शीर्ष लेख को अनुरोध में शामिल किया गया हो, तो उसे जवाब देना चाहिए । यदि यह नहीं था, तो प्रतिक्रिया में अभी भी एक Content-Range
हेडर शामिल हो सकता है , लेकिन प्रतिक्रिया कोड होना चाहिए 200
। यह हेडर वास्तव में पेजिंग के लिए आदर्श लगता है।