design - यूआरएल क्वेरी पैरामीटर के साथ HTTP पोस्ट-अच्छा विचार या नहीं?




rest (5)

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

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

स्रोत: एचटीएमएल 4.01 मानक, धारा 17.13 फॉर्म सबमिशन

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

बातें:

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

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

संपादित करें: इस कारण पर विचार किया जा रहा है कि ऑपरेशन बेवकूफ नहीं हैं और पुनर्प्राप्ति के अलावा साइड इफेक्ट्स हैं। HTTP स्पेक देखें:

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

...

तरीकों में उसमें "idempotence" की संपत्ति भी हो सकती है (त्रुटि या समाप्ति के मुद्दों से अलग) एन> 0 समान अनुरोधों के दुष्प्रभाव एक ही अनुरोध के समान होते हैं। इस संपत्ति को साझा करने के तरीके, सिर, पुट और हटाएं। साथ ही, विधियों के विकल्प और ट्रेस के दुष्प्रभाव नहीं होने चाहिए, और इसलिए स्वाभाविक रूप से बेवकूफ़ हैं।


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

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

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


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


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

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

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


REST शिविर में कुछ मार्गदर्शक सिद्धांत हैं जिनका उपयोग हम HTTP क्रियाओं का उपयोग करने के तरीके को मानकीकृत करने के लिए कर सकते हैं। जब आप रीस्टफुल एपीआई बना रहे हैं तो यह सहायक होता है।

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

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

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

एक जीईटी की तुलना करें जो आप अक्सर कर सकते हैं (idempotent)।





rest