2010-05-31 12 views
12

मुझे पता है कि आप उपयोगकर्ता नाम और पासवर्ड के साथ एक फॉर्म पोस्ट नहीं करना चाहते हैं, जहां कोई इतिहास देखने या परिस्थितियों को देखने के लिए इतिहास का उपयोग कर सकता है जहां दोहराए गए कार्यों को वांछित नहीं किया जा सकता है (किसी पृष्ठ को रीफ्रेश करना = किसी आइटम को किसी आइटम में जोड़ना वांछित नहीं हो सकता है)। तो मुझे समझ में आता है जब मैं एक दूसरे का उपयोग करना चाहूंगा। लेकिन मैं हमेशा कार्ट समस्या के आसपास पाने के लिए सर्वर प्राप्त करने के बाद यूआरएल को रीडायरेक्ट कर सकता था और शायद मेरे ज्यादातर फॉर्म जीईटी के साथ पूरी तरह से ठीक काम करेंगे।मुझे GET के बजाय डेटा पोस्ट क्यों करना चाहिए?

मुझे जीईटी पर POST का उपयोग क्यों करना चाहिए? मैं एक दूसरे के लाभों को समझ नहीं पा रहा हूं। मुझे पता है कि पोस्ट इतिहास/यूआरएल में डेटा नहीं जोड़ता है और आपको पृष्ठ को रीफ्रेश करने के बारे में चेतावनी देगा, लेकिन ये केवल दो मतभेद हैं जिन्हें मैं जानता हूं। एक डेवलपर के रूप में मैं एक दूसरे के ऊपर क्यों उपयोग करना चाहता हूं?

+1

जीईटी के साथ कार्ट में आइटम जोड़ना एक बुरा विचार है क्योंकि GET अनुरोधों को कभी भी सर्वर पर दुष्प्रभाव नहीं होने चाहिए। फ़ेस्टरफ़ॉक्स और Google वेब त्वरक जैसे प्रीफेचिंग प्रोग्राम हैं जो पृष्ठों को पहले से डाउनलोड करके पृष्ठ पर लिंक से सामग्री को प्रीलोड करते हैं। यदि आप दुर्भाग्यपूर्ण हैं तो वे कार्ट में आइटम जोड़ना समाप्त कर सकते हैं जब आपका उपयोगकर्ता केवल उत्पाद पृष्ठ पढ़ रहा हो। – Martin

+1

@ मार्टिन। उसका कुछ मतलब है। AJAX के बारे में क्या? अगर मैं जीईटी या पोस्ट का उपयोग करता हूं तो क्या कोई अंतर है? अगर मैं कुछ जावास्क्रिप्ट कार्यों को चलाने के लिए अनुरोध करता हूं तो मुझे जो डेटा भेज रहा है, उसका अनुमान लगाया जा सकता है। –

+1

प्रीफेचर्स को AJAX अनुरोधों के लिए कोई समस्या नहीं होनी चाहिए, लेकिन मुझे अभी भी विश्वास है कि सही अर्थशास्त्र से चिपकना अच्छा विचार है: प्राप्त करें रिकॉर्ड्स को सर्वर पर दुष्प्रभाव नहीं होना चाहिए (यानी कुछ भी बनाना, हटाना या संशोधित करना)। यदि आप केवल डेटा ला रहे हैं (उदा। ऑटो-पूर्ण बॉक्स के लिए), और सबमिट किया गया डेटा यूआरएल में फिट करने के लिए काफी छोटा है, तो उसे ठीक काम करना चाहिए। पोस्ट प्रतिक्रियाओं के विपरीत, प्रतिक्रिया प्राप्त करें कैश भी किया जा सकता है, जो ऐप के कथित प्रदर्शन को बेहतर बनाता है। – Martin

उत्तर

8

हर HTTP विधि: पोस्ट, प्राप्त डाल, हटाने इत्यादि के लिए अपने स्वयं के अर्थ विज्ञान क्षय। सही विधि चुनते समय HTTP और REST को समझना महत्वपूर्ण है, क्योंकि HTTP जिस तरह से काम करने के लिए था और अंतर्निहित नेटवर्क आधारभूत संरचना संचालित होती है।

बाकी पर एक अच्छा ट्यूटोरियल उपलब्ध here है। यहाँ क्या है पोस्ट के बारे में कहते हैं और तरीकों प्राप्त होता है:

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

    बेवकूफ गारंटी का मतलब है कि आप अनुरोध को फिर से जारी कर सकते हैं। PUT के लिए इडपेपोटेंस की भी गारंटी है (जिसका मूल रूप से अर्थ है "इस डेटा के साथ इस संसाधन को अपडेट करें, या इसे इस यूआरआई में बनाएं यदि यह पहले से नहीं है") और DELETE के लिए (जिसे आप परिणाम प्राप्त करने तक बार-बार कोशिश कर सकते हैं - हटाना ऐसा कुछ नहीं है जो कोई समस्या नहीं है)।POST, जिसका आमतौर पर "नया संसाधन बनाएं" का अर्थ है, मनमाने ढंग से प्रसंस्करण का आह्वान करने के लिए भी उपयोग किया जा सकता है और इस प्रकार न तो सुरक्षित और न ही निष्क्रिय है

+0

मैंने पहले उस बाकी पृष्ठ को देखा। यह सहायक नहीं था। मैं अभी भी नहीं देखता कि मुझे दूसरे मतभेदों को छोड़कर दूसरे पर क्यों उपयोग करना चाहिए। मैं (मेरे लिए आसान ...) क्यों मेरी पढ़ें/लिखें अनुरोध के कई मिल नहीं होना चाहिए –

+0

IMHO नहीं है, बाकी को समझने के लिए अपने सवाल का जवाब देने के लिए महत्वपूर्ण है। मैंने एक अन्य प्रारंभिक आरईएसटी लेख में लिंक जोड़ा और उस अनुभाग का हवाला दिया जहां वे सुरक्षित और बेवकूफ तरीकों की व्याख्या करते हैं। अंतर्निहित वेब आधारभूत संरचना (प्रॉक्सी, गेटवे इत्यादि) को समझना महत्वपूर्ण है आरईएसटी (या HTTP स्पेक) के अनुसार काम करेगा। – Dan

6

एक GET अनुरोध में डेटा के सभी URL है, जो एक आकार की सीमा है और यह भी उपयोगकर्ता के लिए दिख रहा है में किया जाता है। एक POST अनुरोध आपको एक पेलोड भी भेजने की अनुमति देता है।

तकनीकी मतभेद के अलावा, वहाँ आशय का मामला है। HTTP मानक तरीके कि विभिन्न अनुरोधों (GET, POST, PUT, DELETE, HEAD) उपयोग के लिए लक्षित कर रहे हैं वर्णन करता है; उदाहरण के लिए, PUT एक संसाधन जोड़ने का इरादा है, DELETE एक को हटाने का इरादा है, और POST एक को संशोधित करने का इरादा है। क्या आप PUT या DELETE के बजाय GET अनुरोध का उपयोग कर सकते हैं? निश्चित रूप से, लेकिन मानकों के बाद स्पष्ट इरादा बनाता है।

अधिक जानकारी के लिए http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html देखें।

+0

इरादा कैसे अंतर करता है? मुझे याद नहीं है कि मैंने इसे कहाँ देखा था, लेकिन मैंने नोट किया था कि पोस्ट डेटा ने पेज कैश को अपडेट नहीं किया है, ऐसा लगता है कि एक ही चीज एक ही चीज होती है –

+0

आप क्लाइंट और सर्वर के विशिष्ट कार्यान्वयन का जिक्र कर रहे हैं। वास्तव में, वे जो भी चाहते हैं वो करने के लिए स्वतंत्र हैं। कार्यात्मक रूप से, आपको एक वेब सर्वर लिखने से रोकने के लिए कुछ भी नहीं है जो प्रत्येक 'जीईटी' पर संसाधनों को हटा देता है, हर 'डिलीट' पर संसाधन जोड़ता है, लेकिन यदि आप ग्राहक थे और 'GET' संसाधनों को हटा रहे थे तो आप गुस्से में होंगे, क्योंकि यह वही नहीं है जो हम उम्मीद करते हैं। यही कारण है कि इरादा एक फर्क पड़ता है। – danben

+0

ओओपी में, एक और तरीका रखें, आप पूछ सकते हैं कि आपको केवल प्रॉपर्टी को पुनर्प्राप्त करने के लिए 'getProperty()' का उपयोग क्यों करना चाहिए और केवल इसे सेट करने के लिए 'setProperty()' का उपयोग करना चाहिए, जब आप आसानी से रिवर्स कर सकते हैं। एक मानक होने से हमें आश्चर्यचकित होने से बचाता है। – danben

1

अन्य बातों के अलावा, GET 2K लिए सीमित है (कुछ ब्राउज़रों अधिक स्वीकार करेंगे) और यह यूआरएल

6

में दिख रहा है आप चाहते हैं एक idempotent अनुरोध URI (यानी प्रतिक्रिया हमेशा एक ही है), तो जीईटी, अन्य पोस्ट का उपयोग करें।

+0

अगर मुझे /blah.aspx मिलता है और/cmd करता है/blah में पोस्ट करता है? इसके अलावा मैंने कहीं भी देखा जहां जीईटी एक पोस्ट के बाद भी कैश था (शायद यह एक ब्राउज़र बग था? लेकिन यह कोई फर्क नहीं पड़ता कि डेटा जीईटी या पोस्ट-एड था) –

+0

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

+0

मार्क ब्रैकेट: तो ऐसा लगता है कि आपकी कहानियां जीईटी को प्रीफेच की अनुमति है जहां पोस्ट नहीं है। लेकिन एक फॉर्म prefetching समझ में नहीं आता है और अभी मैं AJAX के साथ कर रहा हूँ जो भी समझ में नहीं आता है क्योंकि यह जावास्क्रिप्ट इनपुट की भविष्यवाणी करने की भविष्यवाणी नहीं कर सकता है। –

0

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

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

उस ने कहा, कोई सुरक्षा अंतर नहीं है - इसलिए आपके द्वारा दिया गया उपयोगकर्ता नाम पासवर्ड उदाहरण सटीक नहीं है। पोस्ट आसानी से छेड़छाड़ के रूप में छेड़छाड़ या देखा जाता है।

+0

हाँ लेकिन यह इतिहास में नहीं है और महीने बाद पुनः प्राप्त किया जा सकता है (अगर यह अभी भी मौजूद हैं)। एक सवाल है, अगर मैं एक बात/एक कर वह संचित किया जा सकता है और मैं पोस्ट/b परिणाम अभ्यस्त कैश हो लेकिन अगर मैं का दौरा/एक फिर से मैं अभी भी पुराने डेटा कैश में बनना चाहते हैं तो क्या होगा? डोमेन पर बाकी कैश पोस्ट करता है? या क्या यह सिर्फ इस विशिष्ट पृष्ठ को कैश नहीं करता है? –

+0

@ एसिडज़ॉम्बी- यह सिर्फ इतना कहता है कि उस अनुरोध को कैश न करें। –

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

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