2012-06-10 12 views
9

इस सप्ताह की शुरुआत में, मुझे ऐसा कुछ करना था जो एक अर्थशास्त्र उल्लंघन की तरह महसूस करता हो। मुझे समझाने दो।HTTP प्राप्त करें और पोस्ट करें semantics और सीमाएं

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

हालांकि, आवश्यक पैरामीटर में से एक चर चरम हो सकता है, और इससे मुझे चिंता हुई। चूंकि मैं जीईटी अनुरोध के क्वेरीस्ट्रिंग में सभी पैरामीटर एन्कोड कर रहा था, ऐसा लगता है कि यह एक अनावश्यक upper limit of (roughly) 2000 characters for the request URL रखा गया था। और ध्यान दिए बिना, मुझे 500-वर्ण-लंबे अनुरोध URL देखने को पसंद नहीं आया।

इसलिए, चूंकि एक पोस्ट अनुरोध में ऐसी सीमा नहीं है, इसलिए मैंने स्विच करने का निर्णय लिया। लेकिन यह सही नहीं लगता है। मैं इस धारणा के तहत हूं कि एक पोस्ट डेटा के संशोधन को दर्शाता है - लेकिन मैं इसका उपयोग केवल एक साधारण पढ़ने-योग्य अनुरोध के लिए कर रहा हूं।

क्या ऐसा करने का कोई बेहतर तरीका है? कई मानकों के साथ एक जीईटी करने के लिए? मैंने एक विधि के बारे में सुना है - जहां आप पैरामीटर पैरामीटर का प्रारंभिक पोस्ट करते हैं, और फिर एक GET निष्पादित करते हैं। लेकिन, यह तकनीक वांछित होने के लिए बहुत छोड़ देता है।

लेकिन इस विशिष्ट मामले को देखते हुए, HTTP अनुरोध विधियों के वास्तविक अर्थशास्त्र और सीमाएं क्या हैं? और किसी भी प्रकार के पैरामीटर पेलोड का समर्थन क्यों नहीं करता है? यूआरएल में क्वेरीस्ट्रिंग का उपयोग लगभग मुझे हैक की तरह लगता है।

+0

आपको ऐसा क्यों लगता है कि पोस्ट डेटा संशोधन को दर्शाता है? –

+1

@ कॉनराडफ्रिक्स: फ़ॉर्म अपलोड करने, फ़ाइलों को अपलोड करने और [सामान्य गैर-बेवकूफ कार्रवाइयों] में उपयोग करने के कारण इसका उपयोग करने के कारण (http://en.wikipedia.org/wiki/POST_ (HTTP) #Affecting_server_state) – voithos

+0

यदि आप हैं एक अजाक्स आवेदन लिखना, आप यूआरएल की लंबाई की परवाह क्यों करते हैं?यह भी ध्यान रखें कि 2000 वर्ण सीमा केवल ब्राउज़र यूआरएल पर लागू होती है, न कि अजाक्स अनुरोध (जैसा कि आपने प्रस्तुत लिंक पर टिप्पणियों में उल्लेख किया है)। –

उत्तर

12

इस मुद्दे पर कुछ अंक:

  • HTTP कल्पना (RFC 2616) forbit नहीं अनुरोध पैरामीटर के लिए करता है, तो यह HTTP GET खुद के शब्दों की बात नहीं है। हालांकि, कई HTTP स्टैक (क्लाइंट, सेवाओं या प्रॉक्सी के लिए) HTTP अनुरोधों में निकायों को रोकते हैं, तथ्य यह है कि आप उनका उपयोग नहीं कर सकते हैं, HTTP जीईटी अनुरोध
  • के साथ एक अर्थपूर्ण समस्या से अधिक कार्यान्वयन विस्तार (काफी प्रचलित) है इसी प्रकार, यूआरआई (या क्वेरी स्ट्रिंग) लंबाई की सीमा आरएफसी पर भी निर्दिष्ट नहीं है। यह खराब सर्वर को सर्वर संसाधनों का उपभोग करने से रोकने के लिए कई HTTP सर्वर स्टैक द्वारा कार्यान्वित एक सुरक्षा शमन है (उदाहरण के लिए, आईआईएस/एएसपी.नेट में डिफ़ॉल्ट सीमा 2k है लेकिन आप इसे web.config में कुछ तत्वों के माध्यम से बढ़ा सकते हैं)। फिर, यह एक अर्थपूर्ण नहीं बल्कि व्यावहारिक मुद्दा है।
  • POST अनुरोध डेटा संशोधन को इंगित करते हैं यदि आप आरईएसटी दर्शन का पालन कर रहे हैं, लेकिन केवल पढ़ने के लिए उपयोग किए जाने वाले HTTP POST अनुरोधों के कई उदाहरण हैं। एसओएपी अपने सभी अनुरोधों में POST का उपयोग करता है, भले ही वह जिस ऑपरेशन को कॉल कर रहा है वह एक "सुरक्षित" या "संशोधित" है। तो आप उन परिचालनों के लिए भी POST का उपयोग कर सकते हैं। हालांकि, आरईएसटी (और "कैनोलिक" HTTP) उपयोग से विचलित होने से, आप प्रोटोकॉल की कुछ विशेषताओं को खो देंगे, जैसे कि कैशिंग जिसे जीईटी अनुरोधों के लिए लागू किया जा सकता है, लेकिन पोस्ट के लिए नहीं।
  • दो अनुरोधों का उपयोग करने का आपका उदाहरण (पैरामीटर के साथ पोस्ट + परिणाम प्राप्त करने के लिए प्राप्त करें) ओवरकिल लगता है। जैसा कि मैंने उल्लेख किया है, POST अनुरोधों का अर्थ संसाधनों को संशोधित करने का जरूरी नहीं है, इसलिए एक अनुरोध पर्याप्त होने पर आपको अपने ऑपरेशन तक पहुंचने के लिए एक नया "प्रोटोकॉल" (POST + GET) बनाना नहीं है।
+2

+1 अच्छा जवाब, एक और महत्वपूर्ण बिंदु: जीईटी बेवकूफ माना जाता है, इसलिए यह क्लाइंट द्वारा स्वचालित रूप से पुनः प्रयास किया जा सकता है, POST कभी भी पुनः प्रयास नहीं किया जाता है। –

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