URL क्वेरी पैरामीटर के साथ HTTP POST - अच्छा विचार है या नहीं? [बन्द है]


451

मैं HTTP पर जाने के लिए एक API डिज़ाइन कर रहा हूँ और अगर HTTP POST कमांड का उपयोग कर रहा हूँ, तो मैं सोच रहा हूँ, लेकिन URL क्वेरी पैरामीटर केवल और बिना किसी अनुरोध के, यह जाने का एक अच्छा तरीका है।

बातें:

  • "अच्छा वेब डिज़ाइन" के लिए POST के माध्यम से भेजे जाने वाले गैर-निष्पादक कार्यों की आवश्यकता होती है। यह एक नॉन-इम्पोटेंट एक्शन है।
  • URL में अनुरोध पैरामीटर मौजूद होने पर इस ऐप को विकसित करना और डीबग करना आसान है।
  • एपीआई व्यापक उपयोग के लिए अभिप्रेत नहीं है।
  • ऐसा लगता है कि बिना किसी निकाय के POST का अनुरोध करने से थोड़ा अधिक काम होगा, जैसे Content-Length: 0हेडर को स्पष्ट रूप से जोड़ा जाना चाहिए।
  • यह मुझे भी लगता है कि बिना किसी बॉडी वाला POST अधिकांश डेवलपर और HTTP फ्रेमवर्क की अपेक्षाओं के लिए थोड़ा सा काउंटर है।

क्या अनुरोध बॉडी के बजाय URL क्वेरी के माध्यम से POST अनुरोध पर पैरामीटर भेजने के लिए कोई और नुकसान या फायदे हैं?

संपादित करें: इसका कारण यह माना जाता है कि ऑपरेशन बेकार नहीं हैं और पुनर्प्राप्ति के अलावा अन्य दुष्प्रभाव हैं। HTTP युक्ति देखें :

विशेष रूप से, सम्मेलन की स्थापना की गई है कि GET और HEAD विधियां SHOULD में पुनर्प्राप्ति के अलावा अन्य कार्रवाई करने का महत्व नहीं है। इन तरीकों को "सुरक्षित" माना जाना चाहिए। यह उपयोगकर्ता एजेंटों को POST, PUT और DELETE जैसे अन्य तरीकों का प्रतिनिधित्व करने की अनुमति देता है, विशेष तरीके से, ताकि उपयोगकर्ता को इस तथ्य से अवगत कराया जाए कि संभवतः असुरक्षित कार्रवाई का अनुरोध किया जा रहा है।

...

तरीकों में भी "बेकारता" की संपत्ति हो सकती है (एक तरफ त्रुटि या समाप्ति मुद्दों से) एन> 0 के समान प्रभाव के समान अनुरोध एक ही अनुरोध के लिए समान है। GET, HEAD, PUT और DELETE के तरीके इस संपत्ति को साझा करते हैं। इसके अलावा, तरीकों के विकल्प और ट्रेस विकल्प के साइड इफेक्ट्स नहीं हैं, और इसलिए स्वाभाविक रूप से उदासीन हैं।


11
यदि आप शरीर में डेटा प्रदान नहीं करने जा रहे हैं तो POST का उपयोग क्यों करें?
सनी मिलनोव

114
क्योंकि ऑपरेशन बेकार नहीं है।
स्टीवन हुआविग

20
@Jared, ध्यान दें कि "REST" शब्द 2.5 साल पहले से इस प्रश्न में दिखाई नहीं देता है। :) बेवफाई के बारे में HTTP कल्पना वेब सेवाओं के लिए स्वाद-के-महीने की वास्तुकला की परवाह किए बिना लागू होती है। सौभाग्य से, इस एपीआई के लिए डिज़ाइन किए गए सिस्टम को वैसे भी अप्रचलित किया गया है।
स्टीवन हुआविग

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

13
किसी और के लिए जो नहीं जानता कि क्या बेरोजगारी का मतलब है: | restapitutorial.com/lessons/idempotency.html
क्रिस्टोफर ग्रिग

जवाबों:


259

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

मैं मानता हूं कि POSTएक क्वेरी स्ट्रिंग के साथ भेजना लेकिन एक निकाय के बिना अजीब लगता है, लेकिन मुझे लगता है कि यह कुछ स्थितियों में उचित हो सकता है।

वर्तमान अनुरोध के दायरे को सीमित करने के लिए संसाधन के लिए एक कमांड के रूप में एक URL के क्वेरी भाग के बारे में सोचें। आमतौर पर, क्वेरी स्ट्रिंग का उपयोग किसी GETअनुरोध (जैसे ?page=1&sort=title) को सॉर्ट करने या फ़िल्टर करने के लिए किया जाता है , लेकिन मुझे लगता है कि यह इस POSTपर भी गुंजाइश को सीमित करता है (शायद पसंद है ?action=delete&id=5)।


4
मैंने इस जवाब को इस विशेष मामले के लिए चुना है, लेकिन मुझे लगता है कि आर। बेम्रोस का तर्क सार्वजनिक एपीआई के लिए मजबूर कर रहा है।
स्टीवन हुआविग

4
मुझे नहीं लगता कि उनका जवाब कड़ाई से सही है। यदि आपको पता है कि HTML पेज क्लाइंट को भेजे जाने के बाद आपके फॉर्म पोस्ट के लिए URL पैरामीटर जानते हैं, तो आप उन URL मापदंडों को फॉर्म की कार्रवाई विशेषता पर डील कर सकते हैं, अन्यथा JavaScript URL पैरामीटर सेट कर सकती है जब फॉर्म सबमिट किया जाता है।
डॉन मैककॉघे

3
क्वेरी पैरामीटर के साथ url में xml फ़ाइल के पोस्ट के बारे में कैसे? क्या यह संभव है?
OpenCoderX

3
एक और उदाहरण: अनुरोध डेटा जबकि प्रतिक्रिया के लिए अनुरोध किया प्रारूप क्वेरी पैरामीटर में पारित हो जाता है, http इकाई में हो सकता है ( /action?response_format=json)
आरडीएस

4
+1 ने आज कुछ सीखा। डिलीट करने के लिए एक तकनीकी है बेरोजगार होना। यदि ऑब्जेक्ट वास्तव में हटा दिया गया है, तो आपको 404 नहीं मिलेगा, इसलिए सर्वर की स्थिति समान होगी, लेकिन प्रतिक्रिया अलग होगी। गाय चित्र देखें: restapitutorial.com/lessons/idempotency.html
JPK

131

हर कोई सही है: गैर-बेरोजगार अनुरोधों के लिए POST के साथ रहना।

URI क्वेरी स्ट्रिंग और अनुरोध सामग्री दोनों का उपयोग करने के बारे में क्या? वैसे यह HTTP (नोट 1 देखें) मान्य है, तो क्यों नहीं ?!

यह भी पूरी तरह से तार्किक है: URL, उनके क्वेरी स्ट्रिंग भाग सहित, संसाधनों का पता लगाने के लिए हैं । जबकि HTTP मेथड वर्ब्स (POST - और इसका वैकल्पिक अनुरोध सामग्री) क्रियाओं को निर्दिष्ट करने के लिए है, या संसाधनों के साथ क्या करना है । उन लोगों को ओर्थोगोनल चिंता होनी चाहिए। (लेकिन, वे ContentType = application / x-www-form-urlencoded के विशेष मामले के लिए खूबसूरती से ओर्थोगोनल चिंता नहीं हैं, नीचे नोट 2 देखें।)

नोट 1: HTTP विनिर्देश (1.1) यह नहीं बताता है कि क्वेरी पैरामीटर और सामग्री एक HTTP सर्वर के लिए पारस्परिक रूप से अनन्य है जो POST या DUT अनुरोध स्वीकार करता है। इसलिए कोई भी सर्वर दोनों को स्वीकार करने के लिए स्वतंत्र है। यानी अगर आप सर्वर लिखते हैं तो आपको स्वीकार करने के लिए चुनने से रोकने के लिए कुछ भी नहीं है (शायद एक अनम्य रूपरेखा को छोड़कर)। आम तौर पर, सर्वर जो भी नियम चाहता है उसके अनुसार क्वेरी स्ट्रिंग की व्याख्या कर सकता है। यह उन्हें सशर्त तर्क के साथ भी व्याख्या कर सकता है जो सामग्री-प्रकार जैसे अन्य हेडर को संदर्भित करता है, जो नोट 2 की ओर जाता है:

नोट 2: यदि कोई वेब ब्राउज़र प्राथमिक तरीका है जिससे लोग आपके वेब एप्लिकेशन को एक्सेस कर रहे हैं, और एप्लीकेशन / x-www-form-urlencoded वह कंटेंट-टाइप है जिसे वे पोस्ट कर रहे हैं, तो आपको उस कंटेंट-टाइप के लिए नियमों का पालन करना चाहिए । और आवेदन / x-www-form-urlencoded के नियम बहुत अधिक विशिष्ट हैं (और स्पष्ट रूप से, असामान्य): इस मामले में आपको पैरामीटर के एक सेट के रूप में URI की व्याख्या करनी चाहिए, न कि संसाधन स्थान की। [यह उठाया उपयोगिता का एक ही बिंदु है Powerlord; आपके सर्वर पर POST सामग्री के लिए वेब फ़ॉर्म का उपयोग करना कठिन हो सकता है। बस थोड़ा अलग तरीके से समझाया गया है।]

नोट 3: क्वेरी स्ट्रिंग्स मूल रूप से किस लिए हैं? RFC 3986 HTTP क्वेरी स्ट्रिंग्स को एक URI भाग के रूप में परिभाषित करता है जो एक संसाधन का पता लगाने के गैर-श्रेणीबद्ध तरीके के रूप में काम करता है।

मामले में पाठकों से यह सवाल पूछने की इच्छा होती है कि क्या अच्छा Restful आर्किटेक्चर है: Restful आर्किटेक्चर पैटर्न को विशिष्ट तरीके से काम करने के लिए URI योजनाओं की आवश्यकता नहीं होती है। रीस्टफुल आर्किटेक्चर सिस्टम के अन्य गुणों के साथ खुद को चिंतित करता है, जैसे संसाधनों की cacheability, संसाधनों का डिज़ाइन स्वयं (उनका व्यवहार, क्षमताओं और अभ्यावेदन), और क्या idempotence संतुष्ट है। या दूसरे शब्दों में, एक डिजाइन को प्राप्त करना जो HTTP प्रोटोकॉल और इसके HTTP विधि के सेट के साथ अत्यधिक संगत है। :-) (दूसरे शब्दों में, RESTful वास्तुकला बहुत ही उपयोगी नहीं है कि संसाधन कैसे स्थित हैं ।)

अंतिम नोट: कभी-कभी क्वेरी पैरामीटर का उपयोग अन्य चीजों के लिए किया जाता है, जो न तो संसाधनों का पता लगा रहे हैं और न ही सामग्री को एन्कोडिंग कर रहे हैं। कभी 'PUT = true' या 'POST = true' जैसा क्वेरी पैरामीटर देखा है? ये ब्राउज़र के लिए वर्कअराउंड हैं जो आपको PUT और POST विधियों का उपयोग करने की अनुमति नहीं देते हैं। हालांकि इस तरह के मापदंडों को URL क्वेरी स्ट्रिंग (तार पर) के हिस्से के रूप में देखा जाता है, मैं तर्क देता हूं कि वे आत्मा में URL के क्वेरी का हिस्सा नहीं हैं ।


66

आप कारण चाहते हैं? यहां एक है:

GET और POST के मिश्रण का उपयोग करने वाले पेज पर अनुरोध भेजने के लिए एक वेब फॉर्म का उपयोग नहीं किया जा सकता है। यदि आप फॉर्म की विधि GET पर सेट करते हैं, तो सभी पैरामीटर क्वेरी स्ट्रिंग में हैं। यदि आप प्रपत्र की विधि को POST पर सेट करते हैं, तो सभी पैरामीटर अनुरोध निकाय में हैं।

स्रोत: HTML 4.01 मानक, धारा 17.13 फॉर्म सबमिशन


10
यह एक अच्छा तर्क है, लेकिन मुझे लगता है कि आधुनिक ब्राउज़र का जावास्क्रिप्ट कार्यान्वयन इसे एक बिंदु बनाता है। मैं हालांकि इसके बारे में सोचूंगा - यह भविष्य में प्रूफिंग तरह से सम्मोहक है। सिर्फ इसलिए कि मैं इसके लिए एक फॉर्म का उपयोग नहीं कर रहा हूं इसका मतलब यह नहीं है कि मैं बाद में नहीं चाहता हूं।
स्टीवन हुआविग

9
POST के साथ GET को मिलाना वास्तव में एक बुरा विचार है - बहुत ही सही HTTP को तोड़ना और बिना किसी अच्छे कारण के।
anehlke

6
यह स्निपेट आपके द्वारा जुड़े पेज पर दिखाई नहीं देता है
गारेथ

40
सही, लेकिन विधि विशेषता सिर्फ यह बताती है कि अनुरोध में "फ़ॉर्म डेटा सेट" कैसे शामिल है। जब methodPOST होता है, तो फॉर्म में URI को बदलने का कोई उल्लेख नहीं होता है action। और किसी भी यूआरआई में पहले से ही एक क्वेरी स्ट्रिंग भाग हो सकता है।
गारेथ

16
@Powerlord यह सिर्फ गलत है। उदाहरण के लिए, कार्रवाई के साथ POST के लिए एक फ़ॉर्म सेट करने का प्रयास करें। /Books?bookCode=1234। वेब सर्वर को POST फॉर्म वर्जन और एक क्वेरी स्ट्रिंग मिलेगा।
Jez

9

एक प्रोग्रामेटिक दृष्टिकोण से, क्लाइंट के लिए यह मापदंडों की पैकेजिंग कर रहा है और उन्हें url पर जोड़ रहा है और एक GST बनाम POST का संचालन कर रहा है। सर्वर-साइड पर, यह पोस्ट किए गए बाइट्स के बजाय querystring से इनबाउंड मापदंडों का मूल्यांकन कर रहा है। असल में, यह एक धोने है।

जहां फायदे / नुकसान हो सकते हैं कि कैसे विशिष्ट क्लाइंट प्लेटफॉर्म अपने नेटवर्किंग स्टैक में POST और GET रूटीन के साथ काम करते हैं, साथ ही साथ वेब सर्वर उन अनुरोधों से कैसे निपटता है। आपके कार्यान्वयन के आधार पर, एक दृष्टिकोण दूसरे की तुलना में अधिक कुशल हो सकता है। यह जानते हुए कि यहाँ आपके निर्णय का मार्गदर्शन होगा।

फिर भी, एक प्रोग्रामर के नजरिए से, मैं या तो शरीर में सभी मापदंडों के साथ एक POST की अनुमति देना पसंद करता हूं, या url पर सभी पैरामेट्स के साथ एक GET, और स्पष्ट रूप से किसी भी POST अनुरोध के साथ url मापदंडों की अनदेखी करना। यह भ्रम से बचा जाता है।


8

मुझे लगता है कि यह अभी भी काफी तर्कपूर्ण हो सकता है कि सामग्री पर पेलोड को सीमित रखने के लिए URL पर संसाधन की पहचान करने वाले क्वेरी तर्क हैं। ऐसा लगता है कि "मैं क्या भेज रहा हूं?" बनाम "मैं किसे भेज रहा हूं?"।


5
सवाल REST के बारे में नहीं था।
स्टीवन हुआविग

3
@ user359996 सभी HTTP API रेस्टफुल नहीं हैं। वास्तव में, अधिकांश एपीआई जो दावा करते हैं कि वास्तव में नहीं हैं। इसके अलावा, मजेदार तथ्य, REST केवल HTTP नहीं है।
एलेक मेव

4

बाकी शिविर कुछ मार्गदर्शक सिद्धांत है कि हम जिस तरह से हम का उपयोग HTTP क्रियाओं का मानकीकरण करने का उपयोग कर सकते है। जब आप कर रहे हैं तो RESTful API का निर्माण करते समय यह मददगार होता है।

संक्षेप में: GET केवल पढ़ना चाहिए अर्थात सर्वर स्थिति पर कोई प्रभाव नहीं होना चाहिए। POST का उपयोग सर्वर पर संसाधन बनाने के लिए किया जाता है। PUT का उपयोग संसाधन को अपडेट या बनाने के लिए किया जाता है। DELETE का उपयोग किसी संसाधन को हटाने के लिए किया जाता है।

दूसरे शब्दों में, यदि आपकी एपीआई कार्रवाई सर्वर स्थिति को बदलती है, तो REST हमें POST / PUT / DELETE का उपयोग करने की सलाह देता है, लेकिन GET नहीं।

उपयोगकर्ता एजेंट आमतौर पर समझते हैं कि कई POST करना बुरा है और इसके खिलाफ चेतावनी देगा, क्योंकि POST का इरादा राज्य को बदलने का है (उदाहरण के लिए चेकआउट में माल का भुगतान करना), और आप शायद दो बार ऐसा नहीं करना चाहते हैं!

एक GET की तुलना करें जिसे आप अक्सर (मनपसंद) कर सकते हैं।


13
REST शिविर का कहना है कि आपको HTTP का उपयोग HTTP युक्ति में परिभाषित होना चाहिए। यानी RFC2616 कुछ ज्यादा नहीं, कुछ कम नहीं।
डारेल मिलर

1
जिक्र करते हुए @Darrel ibm.com/developerworks/webservices/library/ws-restful : बाकी डेवलपर्स पूछता HTTP स्पष्ट रूप से और एक तरीका है कि प्रोटोकॉल परिभाषा के अनुरूप में उपयोग करने के लिए तरीके। यह मूल REST डिज़ाइन सिद्धांत बनाएँ, रीड, अपडेट और डिलीट (CRUD) संचालन और HTTP तरीकों के बीच एक-से-एक मैपिंग स्थापित करता है। इस मैपिंग के अनुसार: सर्वर पर संसाधन बनाने के लिए, POST का उपयोग करें। संसाधन प्राप्त करने के लिए, GET का उपयोग करें। किसी संसाधन की स्थिति को बदलने या उसे अद्यतन करने के लिए, PUT का उपयोग करें। किसी संसाधन को हटाने या हटाने के लिए, DELETE का उपयोग करें।
सेल

5
क्षमा करें, लेकिन यह सिर्फ सादा गलत है। REST को एक समान इंटरफ़ेस के अनुपालन की आवश्यकता है। यदि आप HTTP का उपयोग कर रहे हैं, तो उस समान इंटरफ़ेस को RFC 2616 द्वारा भाग में परिभाषित किया गया है। उस संबंध में, HTTP तरीकों को बनाने, पढ़ने, अपडेट करने और हटाने के बीच एक-से-एक मैपिंग नहीं है।
डारेल मिलर

3
GET और DELETE का नक्शा CRUD में पढ़ें और डिलीट करने के लिए बहुत अच्छा है, लेकिन अपडेट और क्रिएट के लिए PUT / POST का उपयोग करना उतना सीधा नहीं है। देखें stackoverflow.com/questions/630453/put-vs-post-in-rest
dcstraw

5
इस 6 साल बाद फिर से देखना, और यह देखते हुए कि प्रश्न को ~ 100k बार देखा गया है, मुझे लगता है कि यह एक छोटे से अपडेट में डालने लायक है। Rest ( ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm ) की फील्डिंग की परिभाषा के अनुसार डारेल सही है - CRUD में HTTP Bbs को मैप करने का कोई उल्लेख नहीं है। आईबीएम की डेवलपर सलाह (ऊपर टिप्पणी में लिंक) रेस्टफुल एपीआई को लागू करने में सामान्य अभ्यास को दर्शाती है, न कि फील्डिंग की परिभाषा रीस्ट की।
1

-13

मैं सहमत हूं - यदि आप केवल URL में डेटा पास कर रहे हैं और शरीर में नहीं हैं तो यह GET अनुरोध का उपयोग करना अधिक सुरक्षित है। पूरे POST + GET अवधारणा पर कुछ अतिरिक्त विचारों के लिए इसी तरह का प्रश्न देखें ।


17
यदि ऑपरेशन के साइड इफेक्ट्स हैं, तो यह निश्चित रूप से GET विधि का उपयोग करने के लिए 'सुरक्षित' नहीं है क्योंकि ब्राउज़र मानता है कि सभी GET बेकार हैं।
dcstraw

खोज इंजन भी एक दुःस्वप्न में परिवर्तित करते हैं, क्योंकि Google GET अनुरोध के साथ सभी लिंक को सुरक्षित रूप से "क्लिक" करेगा, लेकिन बाकी सब को छोड़ देगा। यह इतनी सुरक्षित नहीं है कि एक सेवा को छोड़कर एक निर्दोष क्रॉलर डेटाबेस को गलती से मिटा सकता है।
अलेजांद्रो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.