क्या कस्टम HTTP तरीकों को लागू करने में कोई समस्या है?


34

हमारे पास निम्न प्रारूप में एक URL है

/ उदाहरण / {instanceType} / {} InstanceID

आप इसे मानक HTTP विधियों: POST, GET, DELETE, PUT के साथ कह सकते हैं। हालाँकि, कुछ और क्रियाएं हैं जो हम इस पर लेते हैं जैसे कि "सेव ड्राफ्ट" या "क्यूरेट"

हमने सोचा कि हम सिर्फ कस्टम HTTP तरीकों का उपयोग कर सकते हैं जैसे: DRAFT, VALIDATE, CURATE

मुझे लगता है कि मानकों के कहने के बाद से यह स्वीकार्य है

"HTTP / 1.1 के लिए सामान्य तरीकों के सेट को नीचे परिभाषित किया गया है। हालांकि इस सेट का विस्तार किया जा सकता है, लेकिन अलग-अलग विस्तारित क्लाइंट और सर्वर के लिए एक ही शब्दार्थ साझा करने के लिए अतिरिक्त तरीकों को ग्रहण नहीं किया जा सकता है।"

और WebDav जैसे उपकरण अपने स्वयं के कुछ एक्सटेंशन बनाते हैं।

क्या कोई समस्या है जो किसी ने कस्टम तरीकों से चलायी है? मैं प्रॉक्सी सर्वर और फायरवॉल के बारे में सोच रहा हूं लेकिन चिंता के किसी भी अन्य क्षेत्र में आपका स्वागत है। क्या मुझे सुरक्षित पक्ष पर रहना चाहिए और बस एक URL पैरामीटर होना चाहिए जैसे कार्रवाई = मान्य | क्यूरेट | ड्राफ्ट |


6
जैसा कि मैंने RFC 1925 से फिर से कहा - "प्रोटोकॉल डिजाइन में, पूर्णता तब तक पहुंच गई है जब जोड़ने के लिए कुछ भी नहीं बचा है, लेकिन जब लेने के लिए कुछ भी नहीं बचा है।" - अगर यह काम करता है, तो HTTP में जोड़ने का कोई कारण नहीं है।

4
कुछ भी गलत नहीं है, जब तक आप महसूस करते हैं कि अब आप एक कस्टम प्रोटोकॉल का उपयोग कर रहे हैं न कि HTTP का।
user16764

10
@ user16764 "HTTP / 1.1 के लिए सामान्य तरीकों के सेट को नीचे परिभाषित किया गया है। हालांकि इस सेट का विस्तार किया जा सकता है, अतिरिक्त तरीकों को अलग-अलग विस्तारित क्लाइंट और सर्वर के लिए एक ही शब्दार्थ साझा करने के लिए नहीं माना जा सकता है।" w3.org/Protocols/rfc2616/rfc2616-sec9.html इसलिए इसकी अनुमति है, और यह अभी भी HTTP है
जुआन मेंडेस

imho विधि परिभाषा के अनुसार HTTP से जोड़ने / हटाने के लिए कुछ भी नहीं है, जिसमें कहा गया है कि कस्टम विधियों का उपयोग करना HTTP / 1.1 दायरे के भीतर पहले से ही स्वीकार्य है, लेकिन कैंटीन से समान शब्दार्थ साझा करने की उम्मीद की जा सकती है, इसलिए मुझे @MichaelT और Juan Mées दोनों से अंक मिल सकते हैं। कुछ हद तक
प्रसन्न हों

जवाबों:


42

HTTP के मूलभूत अवरोधों में से एक और REST की केंद्रीय डिज़ाइन सुविधा एक समान इंटरफ़ेस है (अन्य चीजों के साथ) सभी संसाधनों के लिए सार्वभौमिक रूप से लागू होने वाले तरीकों का एक छोटा, निश्चित सेट। एकसमान इंटरफ़ेस बाधा में कई उतार-चढ़ाव हैं। मैं फील्डिंग से उदारतापूर्वक उद्धृत कर रहा हूं ।

एक समान इंटरफ़ेस:

  • सरल है।
  • सेवाओं से कार्यान्वयन को डिकॉय करता है जो वे प्रदान करते हैं।
  • HTTP लोड बैलेंसर्स (nginx) और कैश (वार्निश) जैसी चीजों सहित एक स्तरित वास्तुकला की अनुमति देता है।

दूसरी ओर, एक समान इंटरफ़ेस:

  • दक्षता में गिरावट, क्योंकि सूचना को एक मानकीकृत रूप में स्थानांतरित किया जाता है, जो एक आवेदन की जरूरतों के लिए विशिष्ट है।

ट्रेडऑफ़्स "वेब के सामान्य मामले के लिए डिज़ाइन किए गए हैं" और एक बड़े पारिस्थितिकी तंत्र का निर्माण करने की अनुमति दी है जो वेब आर्किटेक्चर में कई सामान्य समस्याओं का समाधान प्रदान करता है। एक समान इंटरफ़ेस का पालन करने से आपके सिस्टम को इस पारिस्थितिकी तंत्र से लाभ होगा, जबकि इसे तोड़ना मुश्किल होगा। आप nginx की तरह एक लोड बैलेंसर का उपयोग करना चाह सकते हैं लेकिन अब आप केवल एक लोड बैलेंसर का उपयोग कर सकते हैं जो DRAFT और CURATE को समझता है। आप वार्निश की तरह एक HTTP कैश लेयर का उपयोग करना चाह सकते हैं लेकिन अब आप केवल एक HTTP कैश लेयर का उपयोग कर सकते हैं जो DRAFT और CURATE को समझता है। आप सर्वर की विफलता के निवारण के लिए किसी से मदद मांग सकते हैं, लेकिन किसी अन्य व्यक्ति को CURATE अनुरोध के लिए नहीं पता है। नए तरीकों को समझने और सही तरीके से लागू करने के लिए अपने पसंदीदा क्लाइंट या सर्वर लाइब्रेरी को बदलना मुश्किल हो सकता है। और इसी तरह।

इसका प्रतिनिधित्व करने का सही * तरीका संसाधन (या संबंधित संसाधनों) पर एक राज्य परिवर्तन के रूप में है । आप किसी पोस्ट को DRAFT नहीं करते हैं, आप उसके draftराज्य को बदलते हैं trueया आप एक draftसंसाधन बनाते हैं जिसमें पिछले ड्राफ्ट संस्करणों में परिवर्तन और लिंक होते हैं। आप किसी पोस्ट को CURATE नहीं करते हैं, आप उसके curatedराज्य को रूपांतरित करते हैं trueया curationउस संसाधन को बनाते हैं जो पोस्ट को उपयोगकर्ता के साथ लिंक करता है जो इसे क्यूरेट करता है।

* यह सही है कि यह सबसे बारीकी से अन्य वास्तु सिद्धांतों का पालन करता है।


लोड संतुलन पर टिप्पणियों के लिए धन्यवाद, मैं निश्चित रूप से उस पर गौर करूंगा। क्या आप किसी ऐसे संसाधन के बारे में जानते हैं जो बताता है कि कस्टम तरीके स्वीकार्य हैं या नहीं?
जुआन मेंडेस

2
जब तक वे WEBDAV (और फिर भी, इतना नहीं) जैसे व्यापक रूप से समर्थित एक्सटेंशन का एक हिस्सा हैं, तब तक मुझे कस्टम तरीकों का कोई लाभ नहीं दिखता है, इसलिए मैंने कभी इस पर ध्यान नहीं दिया। मैं सिर्फ यह सलाह दूंगा कि आप इन परिवर्तनों को राज्य परिवर्तन के रूप में मानें। वेब हमारे पास पहले से मौजूद तरीकों से ठीक काम करता है। जब तक वे एकसमान इंटरफ़ेस (जैसे PATCH) के एक भाग के रूप में समझ में नहीं आते, तब तक जोड़ने का कोई अच्छा कारण नहीं है।
रीन हेनरिक्स

5
जिस तरह से आप चाहते हैं कि आप अपने HTTP सेवा को अपने लिए काम करने के लिए डिजाइन करने में फायदा देखें। हालाँकि "अतिरिक्त विधियों को एक ही शब्दार्थ को साझा करने के लिए ग्रहण नहीं किया जा सकता है" - पर्याप्त रूप से, लेकिन यह अभी भी HTTP / 1.1 दायरे का हिस्सा है, इसलिए फ़ायरवॉल, परदे के पीछे, लोड बैलेंसर और इस तरह की संभावना के लिए अनुमति देनी चाहिए, अगर वे डॉन करते हैं ' t तब वे HTTP / 1.1 को ठीक से लागू नहीं कर रहे हैं?
प्रोफ'३

आप शायद बाकी पीओवी से सही हैं, हालांकि, मैं यह नहीं देख सकता कि कस्टम क्रियाओं में कोई समस्या क्यों होनी चाहिए। सभी उपकरणों को उन्हें POST की तरह ही व्यवहार करना चाहिए, अर्थात, "संसाधन शायद बदलता है और यह हम सब जानते हैं"।
Maaartinus

7

मैं इन्हें सब-सोर्स के रूप में डिज़ाइन करना पसंद करूँगा, जिस पर आप एक POST अनुरोध करते हैं।

इस बात पर विचार करें कि आपके पास एक संसाधन है /instance/type/1, मेरे पास उस संसाधन का प्रतिनिधित्व होगा जो 'क्रियाओं' के कुछ लिंक को व्यक्त करता है, जिसे संसाधन पर किया जा सकता है, जैसे कि /instance/type/1/draftऔर /instance/type/1/curate। JSON में, यह इतना सरल हो सकता है:

{
    "some property":"the usual value",
    "state": "we can still inform the client about the current state",
    "draft": "http://server/instance/type/1/draft",
    "curate": "http://server/instance/type/1/curate"
}

यह ग्राहक को बहुत स्पष्ट होने की अनुमति देता है कि curateसदस्य द्वारा प्रदान किए गए लिंक पर पोस्ट अनुरोध के दौरान क्या होना चाहिए । वहां तैनात संसाधन में तर्क शामिल हो सकते हैं जो उस घटना को विस्तृत करते हैं, जो शायद, एक राज्य संक्रमण को भड़का सकता है।

एक संसाधन पर संभावित राज्यों के बीच बढ़ने के 'भोले' दृष्टिकोण के साथ जाने से उन घटनाओं को कैप्चर न करने का नुकसान होता है जो इन संक्रमणों के लिए नेतृत्व करते हैं।

राज्य के संक्रमण आमतौर पर विशिष्ट घटनाओं के जवाब में होते हैं, और मैं उन घटनाओं पर कब्जा करने की बजाय ग्राहक को यह तय करने देता हूं कि अब कुछ विशिष्ट 'राज्य' में है। यह सत्यापन को बहुत कठिन बना देता है। इसके अलावा, आप किसी भी 'तर्क' पर तब तक कब्जा नहीं कर पाएंगे, जब तक कि आप खुद राज्य के लोगों का वर्णन नहीं करते। और तब यह सब icky हो जाता है जब कुछ कोड वास्तविक स्थिति संक्रमण के बिना उन लोगों को बदल देते हैं, और सत्यापन की आवश्यकता होती है, और पूरी चीज जल्दी से एक गड़बड़ हो जाती है।


अच्छा उत्तर। राज्य-संक्रमणों को तर्क प्रदान करने में सक्षम होना और सर्वर को इनकैप्सुलेट और प्रबंधित करना, अब तक का सबसे अच्छा तरीका है।
थॉमस डब्ल्यू

मैं (VMware) वर्तमान में कर रहा हूँ कंपनी यह करता है। /vms/some-idरिटर्न पर एक GET कार्रवाई की तरह लिंक POST /vms/some-id/restartऔर हम यह निर्धारित करने के लिए उपयोग करते हैं कि क्या कार्रवाई सक्षम या अक्षम होनी चाहिए। मेरा HateOAS के साथ एक प्रेम / घृणा का रिश्ता है :)
जुआन मेंडेस

यह बहुत अधिक समझ में आता है अगर कार्रवाई की जा रही थी, कुछ यादृच्छिक क्वेरी पैरामीटर, संसाधन पथ खंड या बॉडी प्रॉपर्टी बनाम अनुरोध की क्रिया थी।
मैथ्यू Whited

आप एक क्रिया से लिंक नहीं कर सकते।
डेव वान डेन आईंडी

6

मुझे लगता है कि कस्टम HTTP विधि निकाय कार्यों को लागू करने का सबसे अच्छा तरीका है। निकाय निकाय (POST) में क्रिया जोड़ना सही नहीं लगता, यह आपकी इकाई का हिस्सा नहीं है (हालाँकि इसका परिणाम इसमें बचाया जा सकता है)। इसके अलावा, कस्टम HTTP विधियों का उपयोग करके परदे के पीछे शरीर की आवश्यकता के बिना अपने कार्यों को निर्धारित कर सकते हैं।

यह CRUD की तरह है, आप हमेशा उन पर अमल करना चाहते हैं, लेकिन आपके पास अपने स्वयं के कार्यों का विशिष्ट सेट (प्रति ईर्ष्या) भी है। मैं वास्तव में नहीं देख रहा हूँ कि उन समस्याओं का विस्तार क्या होगा।

इसके अलावा @ हेन हेनरिक्स "आप एक पोस्ट को डीआरएफ़टी नहीं करते हैं, आप इसकी ड्राफ्ट स्थिति को सही में बदल देते हैं या आप एक ड्राफ्ट संसाधन बनाते हैं" मुझे गलत लगता है। एक draftsसंपत्ति का उपयोग राज्य को लगातार बचाने के लिए किया जाएगा, परिवर्तन करने के लिए नहीं। जरूरी नहीं कि क्रियाओं का परिणाम 'राज्य' के रूप में हो, या किसी संपत्ति में सहेजा गया हो। प्रत्येक राज्य / परिवर्तन के लिए एक अलग इकाई बनाना और भी अधिक अस्पष्ट लगता है .. एक ही संदर्भ (यूआरआई) को बनाए रखने की कोशिश करें।


1
यह व्यापक रूप से असहमत है, मैं इसके पीछे तर्क देख सकता हूं और मैं इस बात से सहमत नहीं हूं (विशेषकर मतदाता की कोई टिप्पणी नहीं)। आइए एक उदाहरण के रूप में PHP अपवाद हैंडलिंग को लेते हैं, "बेस्ट प्रैक्टिस" विशिष्ट अपवाद प्रकारों का उपयोग करने के लिए झुकाव की ओर लगता है, यहां तक ​​कि अपवाद के सुझाव को भी ध्यान में रखते हुए, जैसे RuntimeException बनाम BadMethodCallException। तो यह क्यों व्यापक रूप से DRAFT का उपयोग करने के खिलाफ तर्क दिया जाता है यदि कस्टम तरीकों का उपयोग करके पहले से ही HTTP / 1.1 गुंजाइश का हिस्सा माना जाता है? और लोड
बैलेंसर्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.