2009-09-16 5 views
15

मूल प्रश्न HTTP शीर्षलेखों के उपयोग के बारे में है, जिसमें Range, If-Range, Accept-Ranges और एक उपयोगकर्ता परिभाषित सीमा विनिर्देशक शामिल है।बाइट्स के अलावा किसी सीमा विनिर्देशक के साथ HTTP रेंज हेडर का उपयोग करना?

यहां मेरे प्रश्न को स्पष्ट करने में मदद के लिए एक निर्मित उदाहरण है। मान लें कि मेरे पास एक वेब 2.0 स्टाइल एप्लिकेशन है जो कुछ प्रकार के मानव पठनीय दस्तावेजों को प्रदर्शित करता है। ये दस्तावेज़ संपादकीय रूप से पृष्ठों में विभाजित हैं (समाचार वेबसाइटों पर आपके द्वारा देखे जाने वाले लेखों के समान)। इस उदाहरण के लिए, मान लें:

  • शीर्षक "HTTP रेंज प्रश्न" तीन पृष्ठों में टूट जाती है एक दस्तावेज नहीं है।
  • शैल पेज (/document/shell/http-range-question) पृष्ठों की संख्या सहित दस्तावेज़ के बारे में मेटा जानकारी जानता है।
  • दस्तावेज का पहला पठनीय पृष्ठ पेज एन्ज़ेल ईवेंट के दौरान लोड किया जाता है और AJAX GET के माध्यम से पृष्ठ पर डाला जाता है।
  • एक यूआई नियंत्रण जो जैसा दिखता है [1 2 3 सभी] पृष्ठ के निचले हिस्से में है, और किसी संख्या पर क्लिक करने से वह पठनीय पृष्ठ (AJAX के माध्यम से भी लोड किया जाएगा) प्रदर्शित होगा, और "ऑल" पर क्लिक करने से प्रदर्शित होगा पूरा दस्तावेज सवाल का
    • /document/content/http-range-question?page=1
    • /document/content/http-range-question?page=2
    • /document/content/http-range-question?page=3
    • /document/content/http-range-question

अब: 1, 2, 3 के लिए इन URL और सभी उपयोग के मामलों मान लें। क्या मैं यूआरएल के बजाय HTTP रेंज हेडर का उपयोग कर सकता हूं (उदा। क्वेरीस्ट्रिंग पैरामीटर)? हो सकता है कि GET /document/content/http-range-question अनुरोध पर कुछ इस तरह:

Range: page=1 

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

Range: bytes=0-499 

कस्टम सीमा विनिर्देशकों के किसी भी राय या असली दुनिया के उदाहरण?

अद्यतन: मैं रेंज हैडर (Paging in a Rest Collection) जहाँ वे कि डोजो के JsonRestStore एक कस्टम रेंज हैडर मान का उपयोग करता उल्लेख के बारे में एक ऐसी ही सवाल मिला।

Range: items=0-24 
+0

[एक संग्रह संग्रह में पेजिंग] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/924472/paging-in-a-rest-collection) – DanMan

+0

@DanMan - मैं पहले से ही इसी तरह के प्रश्न से जुड़ा हुआ था, लेकिन सभी HTTP आरईएसटी नहीं है और यह स्वीकार्य मूल्यों के बारे में एक प्रश्न पूछता है, आरईएसटी अर्थशास्त्र नहीं। इसके अलावा, अलग-अलग प्रश्न शीर्षक शब्द अलग-अलग लोगों को उनके उत्तरों खोजने में मदद करते हैं। –

उत्तर

32

बिल्कुल - आप अपनी पसंद की किसी भी श्रेणी इकाइयों को निर्दिष्ट करने के लिए स्वतंत्र हैं।

RFC 2616 से:

3,12 रेंज इकाइयों

HTTP/1.1 एक ग्राहक कि केवल एक हिस्सा (की एक सीमा)
प्रतिक्रिया इकाई प्रतिक्रिया में शामिल किए जाने का अनुरोध करने की अनुमति देता है। HTTP/1.1 रेंज इकाइयों रेंज (धारा 14.35) और सामग्री-रेंज (सेक्शन 14.16)
हेडर फ़ील्ड में रेंज इकाइयों का उपयोग करता है। विभिन्न संरचनात्मक इकाइयों के अनुसार एक इकाई को को उपनगरों में विभाजित किया जा सकता है।

range-unit  = bytes-unit | other-range-unit 
    bytes-unit  = "bytes" 
    other-range-unit = token 

केवल सीमा इकाई HTTP द्वारा परिभाषित/1.1 है "बाइट"। HTTP/1.1
कार्यान्वयन अन्य इकाइयों का उपयोग करके निर्दिष्ट श्रेणियों को अनदेखा कर सकता है।

मुख्य टुकड़ा अंतिम अनुच्छेद है। वास्तव में यह कह रहा है कि जब उन्होंने HTTP/1.1 के लिए spec लिखा, तो उन्होंने केवल "बाइट्स" टोकन को रेखांकित किया। लेकिन, जैसा कि आप 'अन्य-श्रेणी-इकाई' बिट से देख सकते हैं, आप अपने टोकन विनिर्देशकों के साथ आने के लिए स्वतंत्र हैं।

अपने स्वयं के रेंज विनिर्देशकों के साथ आने का मतलब यह है कि आपको क्लाइंट और सर्वर कोड पर नियंत्रण रखना होगा जो उस विनिर्देशक का उपयोग करता है। इसलिए, यदि आपके पास बैकएंड टुकड़ा है जो "/ दस्तावेज़/सामग्री/http-range-question" यूआरआई का खुलासा करता है, तो आप जाने के लिए अच्छे हैं; संभवतः आप एक आधुनिक वेब ढांचे का उपयोग कर रहे हैं जो आपको अनुरोध हेडर आने का निरीक्षण करने देता है। फिर आप बैकिंग क्वेरी को सही तरीके से करने के लिए रेंज मानों को देख सकते हैं।

इसके अलावा, अगर आप AJAX कोड को नियंत्रित करते हैं जो बैकएंड को अनुरोध करता है, तो आप रेंज हेडर को स्वयं सेट करने में सक्षम होना चाहिए।

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

आप एक क्वेरी स्ट्रिंग का उपयोग करने के बजाय वैकल्पिक कार्यान्वयन पर भी विचार कर सकते हैं, तो आप पृष्ठ को यूआरआई का "पैरामीटर" बनाते हैं; उदा .:/दस्तावेज़/सामग्री/http-range-question/पृष्ठ/1। यह आपके लिए सर्वर-साइड के लिए थोड़ा और अधिक काम करेगा, लेकिन यह HTTP/1.1 अनुपालन है और कैश को इसका ठीक से इलाज करना चाहिए।

उम्मीद है कि इससे मदद मिलती है।

+0

कैशिंग पर अच्छा बिंदु, लेकिन यही "हेडर" हेडर के लिए है। http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.44 बड़ी समस्या यह है कि यह बहुत नफरत नहीं है। –

-2

ऐसा लगता है कि आप की तरह सिर्फ एक क्वेरी स्ट्रिंग पैरामीटर को निकालने के लिए HTTP कल्पना बदलना चाहते हैं। ऐसा करने के लिए आपको संशोधित शीर्षलेख और सर्वर को क्वेरीस्ट्रिंग के बजाय "श्रेणी" शीर्षलेख से पढ़ने के लिए दोनों क्लाइंट पर कोड संशोधित करना होगा।

अंत परिणाम यह है कि यह शायद काम करेगा, लेकिन आप ऐसा करने के लिए सभी मानकों और मौजूदा उपकरण तोड़ रहे हैं।

+4

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

+3

मैं केविन से सहमत हूं और मुझे लगता है कि विनिर्देश स्पष्ट है कि यह संभव है (प्रतिक्रिया में एक स्वीकार्य-श्रेणी फ़ील्ड क्यों होना चाहिए जो सर्वर द्वारा स्वीकार की गई रेंज इकाइयों को निर्दिष्ट करता है)। इसके अतिरिक्त लौटने पर उदा। एक जेएसओएन सरणी संग्रह सामग्री-रेंज प्रतिक्रिया सभी वस्तुओं का आकार दे सकती है उदा। सामग्री-रेंज: आइटम 0-9/20 जबकि क्वेरीस्ट्रिंग समाधानों को किसी भी तरह से उस जानकारी को कहीं और स्थानांतरित करना होता है। – Daff

0

HTTP रेंज आमतौर पर शुरुआत से शुरू किए बिना बाधित डाउनलोड पुनर्प्राप्त करने के लिए उपयोग की जाती है।

जो आप करने की कोशिश कर रहे हैं उसे OAI-ORE द्वारा बेहतर तरीके से संभाला जाएगा, जो आपको कई दस्तावेज़ों के बीच संबंधों को परिभाषित करने की अनुमति देता है। (वैकल्पिक प्रारूप, पूरे के घटक, आदि)

दुर्भाग्यवश, यह अपेक्षाकृत नया मेटाडाटा प्रारूप है, और मुझे देशी समर्थन के साथ जहाज वाले किसी भी वेब ब्राउज़र के बारे में पता नहीं है।

0

बाइट्स HTTP 1.1 विशिष्टता द्वारा समर्थित एकमात्र इकाई है।

+2

हां, लेकिन नई रेंज इकाइयां एक एक्सटेंशन बिंदु –

+0

है, नई श्रेणी इकाइयों को "रेंज यूनिट रजिस्ट्री" में पंजीकृत होना है जैसा कि https://tools.ietf.org/html/rfc7233#section-2.2 में उल्लिखित है, आधिकारिक पंजीकरण के बिना कोई अन्य बाइट्स-यूनिट या "कोई नहीं" अमान्य है। –

+0

7233 से: "नई श्रेणी इकाइयों * * को आईएएनए के साथ पंजीकृत होना चाहिए।" (जोर मेरा)। "Ought" को में परिभाषित नहीं किया गया है। क्या यह एक आवश्यकता थी, यहां तक ​​कि एक मुलायम, क्या उन्होंने "जरूरी", "आवश्यक", "शॉल", "चाहिए", या "अनुशंसित" शर्तों में से एक के साथ संकेत नहीं दिया होगा? –

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