पेलोड में एक संसाधन आईडी शामिल करने के लिए या URI से प्राप्त करने के लिए


13

API डिज़ाइन करना, हम इस सवाल के खिलाफ आए हैं कि क्या किसी PUT पेलोड में अपडेट की जा रही संसाधन की ID होनी चाहिए या नहीं।

वर्तमान में हमारे पास यही है:

PUT /users/123 Payload: {name: "Adrian"}

हमारा रूट कोड यूआरआई से आईडी निकालता है और अपडेट के साथ जारी रहता है।

हमारे एपीआई के पहले उपयोगकर्ता सवाल कर रहे हैं कि हम पेलोड में आईडी की अनुमति क्यों नहीं देते हैं:

PUT /users/123 Payload: {id: 123, name: "Adrian"}

इसका कारण हमने इसकी अनुमति नहीं दी क्योंकि आईडी पेलोड और यूआरआई में डुप्लिकेट है।

इस बारे में कुछ और सोचकर, हम संसाधन को URI को युग्मित कर रहे हैं।

यदि यूआरआई के पास आईडी नहीं है, तो पेलोड को संशोधित करने की आवश्यकता होगी:

PUT /no/id/here Payload: {name: "Adrian"} < What user???

क्या कोई कारण नहीं हैं?

जवाबों:


14

आप कर रहे हैं चाहिए वर्दी जोड़े के लिए संसाधन के लिए पहचानकर्ता संसाधन

जब आरईएसटी को HTTP के साथ लागू किया जाता है, तो आप संसाधन का वर्तमान मान प्राप्त करने के लिए GET का उपयोग करते हैं और एक नया मान सेट करने के लिए PUT करते हैं। GET में पेलोड नहीं है, इसलिए संसाधन को URI द्वारा पहचाना जाना चाहिए। और PUT तार्किक रूप से एक ही URI के लिए किया जाता है और पेलोड को ठीक वैसा ही दिखना चाहिए जैसा आप अगले GET को वापस चाहते हैं।

आप विभिन्न URI के लिए POST का उपयोग कर सकते हैं, लेकिन यह केवल कम समझ में आएगा क्योंकि यह GET के लिए अनावश्यक रूप से विषम होगा। आम URI के लिए POST केवल नए संसाधन ( POST /users/new, पेलोड: {name: "Adrian"}प्रतिक्रिया {id: 345, name: "Adrian"}) बनाने के लिए समझ में आ सकता है , लेकिन यह बेकार नहीं है और इसलिए इससे बचा जाना चाहिए यदि आप REST के लिए प्रयास कर रहे हैं¹। इसके बजाय आपको एक कॉल के साथ आईडी आरक्षित करनी चाहिए और फिर नई आईडी सेट करने के लिए PUT का उपयोग करना चाहिए; यह दोष-सहिष्णु है, क्योंकि यदि पहला अनुरोध विफल हो जाता है, तो आईडी आरक्षण अंततः समाप्त हो सकता है और PUTयह बेकार है। या क्लाइंट-जनरेटेड यूयूआईडी का उपयोग करें।


Does REST की परिभाषा के बारे में कुछ भी नहीं कहा जाता है, इसलिए मैं वास्तव में यह दावा नहीं कर सकता कि यदि आपके पास गैर-बेरोजगार ऑपरेशन हैं। यह इस तथ्य को नहीं बदलता है कि बेकार के अनुरोधों से चिपके हुए चीजें जटिल किए बिना चीजों को अधिक विश्वसनीय बनाती हैं और इसलिए उन्हें अनुशंसित किया जाता है।


3
जहां तक ​​मुझे पता है कि एक POST अनुरोध को बेकार नहीं होना चाहिए। इसलिए मुझे पोस्ट करने में कोई समस्या नहीं है /users('नया' जोड़ने की आवश्यकता नहीं है)।
lex82

आपके जवाब के लिए धन्यवाद। मैं देख रहा हूं कि सभी अनुरोधों के लिए आदर्शता रखना एक अच्छी सुविधा है, लेकिन कौन कहता है कि यह एक रीस्ट एपीआई के लिए आवश्यक है? निश्चित रूप से कई API जो खुद को Restful कहते हैं, नॉन-इम्पोटेंट POST अनुरोधों की अनुमति देते हैं (विशेषकर जब सर्वर नए संसाधनों के लिए आईडी जनरेट करता है)। लेकिन अगर आप REST की बहुत सख्त परिभाषा को लागू करते हैं, तो भी मुझे यह नहीं दिखता है कि ऊपर दिए गए उदाहरण की तरह गैर-बेरोजगार POST के साथ कौन से वास्तु बाधा का उल्लंघन किया गया है।
lex82

मैं निश्चित रूप से POST अनुरोधों की छवि बना सकता हूं जो एक बाधा का उल्लंघन करते हैं। मैं सिर्फ यह नहीं देखता कि संग्रह में संसाधन को पोस्ट करना और सर्वर को उसकी आईडी पर निर्णय लेने देना क्यों बाकी बाधाओं का उल्लंघन है।
lex82


3
POST का पूरा विचार
बेवकूफी भरा

2

इस बारे में कुछ और सोचकर, हम संसाधन को URI को युग्मित कर रहे हैं।

यदि यूआरआई के पास आईडी नहीं है, तो पेलोड को संशोधित करने की आवश्यकता होगी:

PUT / no / id / यहां पेलोड: {नाम: "एड्रियन"} <क्या उपयोगकर्ता ???

क्या कोई कारण नहीं हैं?

इस सवाल का जवाब इस बात पर निर्भर करता है कि क्या आप क्लाइंट को आईडी बदलने की अनुमति देना चाहते हैं?

यदि क्लाइंट एक PUT के माध्यम से ID को बदल सकता है, तो संसाधन के लिए URI बदल जाएगा, और आपको किसी भी समय पुराने URI तक पहुँचने के लिए 301 मूव्ड स्थायी रूप से प्रदान करना चाहिए।

इसलिए उदाहरण के लिए आप एक संसाधन से शुरू करते हैं

/users/123

और ग्राहक संसाधन पर निम्नलिखित कार्य करता है

{id: 222, name: "Adrian"}

संसाधन को अद्यतन कर दिया गया है और इसका URI अब है

/users/222

LocationPUT जवाब में क्षेत्र नए URI को शामिल करना चाहिए, और यदि आप के लिए जाना /users/123यदि आप एक मिलना चाहिए 301स्थान फ़ील्ड नए की ओर इशारा करते के साथ प्रतिक्रिया /users/222संसाधन।

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

यदि आप एक ही संसाधन पर एक अलग URI के लिए आवश्यकता होती है, कहते हैं

/users/adian_lync

तब यदि वह संसाधन मौजूद नहीं है तो सर्वर को इसे बनाना चाहिए और इसे बनाते समय आईडी बनाना चाहिए


1
पेलोड में आईडी की नियुक्ति पर सवाल करने का कारण Backbone.js द्वारा डिफ़ॉल्ट रूप से एक PUT अनुरोध में आईडी पास करने के कारण था। हम इसे होने से रोक सकते हैं, लेकिन अब मैं जानना चाहता हूं कि यह डिफ़ॉल्ट व्यवहार क्यों है।
एड्रियन लिंच

1
डर लगता है कि मैं Backbone.js से परिचित नहीं हूँ। यदि URL में ID को भी शामिल किया गया है तो अनावश्यक रूप से देखें। शायद देवों की ओर से एक निरीक्षण
कॉर्मैक मुलहॉल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.