एक RESTful 'PUT' ऑपरेशन को कुछ लौटाना चाहिए


437

मैं सोच रहा था कि लोगों की राय एक रेस्टफुल PUTऑपरेशन के बारे में क्या है जो रिस्पांस बॉडी में कुछ भी नहीं देता है।

जवाबों:


614

HTTP विनिर्देशन ( RFC 2616 ) में कई सिफारिशें हैं जो लागू हैं। यहाँ मेरी व्याख्या है:

  • 200 OKएक मौजूदा संसाधन के लिए एक अद्यतन के सफल PUT के लिए HTTP स्थिति कोड । कोई प्रतिक्रिया शरीर की जरूरत है। ( धारा 9.6 के अनुसार , 204 No Contentऔर भी अधिक उपयुक्त है।)
  • 201 Createdएक नए संसाधन के सफल PUT के लिए HTTP स्थिति कोड , स्थान शीर्षलेख क्षेत्र में लौटे नए संसाधन के लिए सबसे विशिष्ट URI के साथ और प्रतिक्रिया शरीर में किसी भी अन्य प्रासंगिक URI और संसाधन के मेटाडेटा गूँजते हैं। ( RFC 2616 धारा 10.2.2 )
  • HTTP 409 ConflictPUT के लिए HTTP स्थिति कोड जो कि 3 rd -party संशोधन के कारण असफल है , प्रयास किए गए अद्यतन और प्रतिक्रिया शरीर में वर्तमान संसाधन के बीच अंतर की सूची के साथ। ( RFC 2616 धारा 10.4.10 )
  • 400 Bad Requestप्रतिक्रिया शरीर में प्राकृतिक-भाषा पाठ (जैसे अंग्रेजी) के साथ एक असफल PUT के लिए HTTP स्थिति कोड बताता है कि PUT विफल क्यों हुआ। ( RFC 2616 धारा 10.4 )

25
@stian दिलचस्प! यह मोज़िला की ओर से बहुत ही उचित लगता है, क्योंकि मुझे RFC 2616 (विशेष रूप से 10.2 सफल 2xx और 10.2.1 200 ओके ) में कुछ भी नहीं मिल रहा है, जो विशेष रूप से 200PUT, DELETE, या किसी अन्य विधि के उपयोग के बारे में बताते हैं । क्या मैं कुछ भुल गया? जैसे कि मोज़िला W3 और IETF का बॉस बन रहा है? ;) या हो सकता है कि उन्होंने कभी पोस्टेल के रोबस्टनेस सिद्धांत के बारे में नहीं सुना हो।
प्रणाली PAUSE

52
@stian: उस वाक्य को 3 फरवरी 2013 को हटा दिया गया था। संभवत: क्योंकि किसी ने इसके बारे में यहां पढ़ा है। ;) डेवलपर
mozilla.org/en-US/docs/HTTP/…

6
PUT पद्धति का शब्दार्थ यह है कि संसाधन में जो भी वर्तमान स्थिति है उसे अनदेखा करना है, इसलिए किसी PUT के लिए 409 संघर्ष को वापस करने के लिए जो कि एक 3 पार्टी संशोधन के कारण असफल है केवल यह समझ में आता है कि अनुरोध सशर्त है।
पेड्रो वर्नक

8
@systemPAUSE अच्छा जवाब। एक छोटा बिंदु: यदि आप एक सफल ऑपरेशन के लिए प्रतिक्रिया निकाय नहीं दे रहे हैं, तो मैं विशेष रूप से 204 का उपयोग करने का सुझाव दूंगा। कुछ क्लाइंट (jQuery के अजाक्स, उदाहरण के लिए) अगर वे एक गैर-शून्य लंबाई प्रतिक्रिया की उम्मीद कर रहे हैं, तो वह घुट जाएगा। आप इस प्रश्न में इसका एक उदाहरण देख सकते हैं ।
निक_व

3
संभवतः RFC2616 को अपडेट किया गया था क्योंकि यह उत्तर दिया गया था। नहीं जहां 9.6 में यह No response body neededएक 200 के संबंध में उल्लेख करता है। वास्तव में प्रतिक्रिया शरीर का उल्लेख एक PUT के संबंध में बिल्कुल नहीं है। यह केवल कहा गया हैIf an existing resource is modified, either the 200 (OK) or 204 (No Content) response codes SHOULD be sent to indicate successful completion of the request.
जेम्स

164

यहाँ अधिकांश उत्तरों के विपरीत, मुझे वास्तव में लगता है कि PUT को अपडेटेड रिसोर्स (HTTP कोड ऑफ़ कोर्स के अलावा) वापस करना चाहिए।

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


3
"सर्वर इस संसाधन के लिए कुछ प्रसंस्करण भी लागू कर सकता है": मैं यह नया हूं। क्या यह वास्तव में उचित है?
रायडवल

22
@Raedwald यकीन है कि यह है। REST की आवश्यकता नहीं है कि पूरे संसाधन को PUT पर अपडेट किया जाए, हालाँकि यह आमतौर पर अनुशंसित है। कुछ क्षेत्रों को अद्यतन करने के लिए कोई मतलब नहीं हो सकता है - बनाई गई तिथि या अंतिम संशोधित तिथि, उदाहरण के लिए, संभवतः PUT निकाय में शामिल नहीं होना चाहिए, लेकिन संभवतः PUT के परिणामस्वरूप इसे बदल दिया जाएगा। यह कहा गया है, मैं LiorH से सहमत नहीं हूं कि PUT को संसाधन की वापसी में परिणाम करना चाहिए; अद्यतन संसाधन प्राप्त करने के लिए मुझे PUT के बाद एक GET की आवश्यकता होगी।
Randolpho

19
@ रैंडोल्फ रेस्ट की आवश्यकता नहीं है कि एक PUT पर पूरे संसाधन को अपडेट किया जाए क्या यह PATCH का मामला नहीं होना चाहिए?
मार्को सीम्ब्रोन

14
@MarcoCiambrone हां, मैं सहमत हूं और मैं अपनी पिछली टिप्पणी को पुनः प्राप्त करता हूं। मैंने अपनी धुन को REST और PUT में बदल दिया है - PUT को हमेशा एकरूप होना चाहिए और इसे कभी भी आंशिक अद्यतन के लिए उपयोग नहीं किया जाना चाहिए। जब तक PATCH समर्थित नहीं है, तब तक POST एकमात्र विकल्प है, ऐसे में PATCH एक अच्छा विकल्प हो सकता है। PATCH एक नई क्रिया है, हालाँकि, और कुछ सर्वर-साइड फ्रेमवर्क द्वारा समर्थित नहीं हो सकती है।
रैंडोल्फो

2
उत्तर को rfc7231 से पहले अच्छी तरह से लिखा गया था, लेकिन खंड 4.3.4 यह स्पष्ट करता है कि "PUT विधि अनुरोध करती है कि लक्ष्य संसाधन की स्थिति का निर्माण किया जाए या अनुरोध संदेश पेलोड में संलग्न प्रतिनिधित्व द्वारा परिभाषित राज्य के साथ प्रतिस्थापित किया जाए"
aaaa

3

मुझे लगता है कि सर्वर के लिए PUT के जवाब में सामग्री लौटाना संभव है। यदि आप एक प्रतिक्रिया आवरण प्रारूप का उपयोग कर रहे हैं जो साइडलोड किए गए डेटा (जैसे कि एम्बर-डेटा द्वारा खपत प्रारूप) की अनुमति देता है, तो आप अन्य वस्तुओं को भी शामिल कर सकते हैं जिन्हें डेटाबेस ट्रिगर के माध्यम से संशोधित किया गया है, आदि (साइडलोड डेटा को कम करने के लिए स्पष्ट रूप से है # अनुरोधों का, और यह अनुकूलन करने के लिए एक ठीक जगह जैसा लगता है।)

अगर मैं सिर्फ PUT को स्वीकार करता हूं और वापस रिपोर्ट करने के लिए कुछ भी नहीं है, तो मैं बिना किसी शरीर के साथ स्थिति कोड 204 का उपयोग करता हूं। यदि मेरे पास रिपोर्ट करने के लिए कुछ है, तो मैं स्थिति कोड 200 का उपयोग करता हूं, और एक निकाय शामिल करता हूं।


2

HTTP / 1.1 कल्पना (खंड 9.6) उचित प्रतिक्रिया / त्रुटि कोड चर्चा करता है। हालाँकि यह प्रतिक्रिया सामग्री को संबोधित नहीं करता है।

आप क्या उम्मीद करेंगे? एक सरल HTTP प्रतिक्रिया कोड (200 आदि) मुझे सीधा और अस्पष्ट लगता है।


हां, लेकिन क्या होगा अगर आप यह जांचना चाहते हैं कि क्या PUT या POST के बाद db में डाला गया डेटा वास्तव में आपके इच्छित सच्चे डेटा का प्रतिनिधित्व करता है। बेहतर होगा कि HTTP प्रतिक्रिया का मुख्य भाग वापस भेज सके।
tnkh

1
@ आप जो सुझाव देते हैं वह एक भयानक विचार है। आप क्या चाहते हैं, इसे प्राप्त करने के लिए एक सफल अपडेट के बाद एक अलग GET कॉल करें। यदि आप इस विभाग में समस्याओं का सामना कर रहे हैं तो प्रदर्शन को सुनिश्चित करने के लिए एक कैशिंग लेयर की शुरुआत करें। हम 'सब कुछ जाता है' तर्क के साथ खिलवाड़ करके इन मुद्दों को हल नहीं कर सकते। 'ठोस' और बुनियादी प्रोग्रामिंग सिद्धांतों के साथ खिलवाड़ न करें जो कि वर्ष 2020 में सामान्य ज्ञान होना चाहिए। यह एक अपमान है!
XDS

@XDS मैं टिप्पणी के अपने पहले भाग को स्वीकार करता हूं। लेकिन इसके बाद मेरी आँखों को लुढ़काने के लिए रुकना नहीं चाहिए। उल्लसित टिप्पणी
tnkh

हालांकि आप इसे प्रफुल्लित करने वाला क्यों पाते हैं, इसके बारे में विस्तार से धन्यवाद।
XDS

2

यदि REST API का बैकएंड SQL रिलेशनल डेटाबेस है, तो

  1. आपके पास हर रिकॉर्ड में रोवोरस होना चाहिए जिसे अपडेट किया जा सकता है ( खोई हुई समस्या से बचने के लिए )
  2. आपको हमेशा PUT के बाद रिकॉर्ड की एक नई प्रति लौटानी चाहिए (नया RowVersion प्राप्त करने के लिए )।

यदि आप खोए हुए अपडेट की परवाह नहीं करते हैं, या यदि आप अपने ग्राहकों को PUT के तुरंत बाद GET करने के लिए बाध्य करना चाहते हैं, तो PUT से कुछ भी वापस न करें।


1

ग्राहक द्वारा नए बनाए गए संसाधन को खोजने के लिए "स्थान" शीर्षक के साथ "बनाया गया" के लिए 201 का Http प्रतिक्रिया कोड।


5
PUT ऑब्जेक्ट्स नव निर्मित संसाधन नहीं हैं (या नहीं होना चाहिए)
kdazzle

9
@kdazzle PUT निश्चित रूप से एक नव निर्मित संसाधन हो सकता है, और अक्सर होगा। w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.6
चार्ली

3
बस मेरी टिप्पणी को थोड़ा बेहतर ढंग से समझाने के लिए। PUT का अर्थ है, इस आइटम को इस विशिष्ट स्थान पर रखें, जो वर्तमान में वहाँ है (यदि लागू हो)।
user1751825

3
सही, "वर्तमान में क्या है इसकी जगह" प्रमुख वाक्यांश है। यह पहले से ही मौजूद होना चाहिए और इसे प्रतिस्थापित किया जा रहा है। PUT नए संसाधन बनाने के लिए नहीं होना चाहिए।
केविन एम

3
@KevinM नवीनतम RFC doc rfc7231 के रूप में , यह कहता है कि संसाधन बनाए जा सकते हैं: "PUT विधि अनुरोध करती है कि लक्ष्य संसाधन की स्थिति बनाई जाए या बदल दी जाए [...]" और जिस कारण से आप सोच रहे हैं कि PUT नहीं बना सकता है। नया संसाधन इसलिए है क्योंकि आपको आवश्यक रूप से नए संसाधन का स्थान नहीं पता है। लेकिन अगर आपको इसका स्थान / पहचानकर्ता पता है, तो इसे बनाया जा सकता है यदि यह अभी तक वहां नहीं है।
लियो लेई

0

मैंने अपनी सेवाओं में RESTful API का उपयोग किया, और यहाँ मेरी राय है: पहले हमें एक आम दृश्य के लिए जाना चाहिए PUTused का उपयोग किसी संसाधन को बनाने या प्राप्त करने के लिए अद्यतन करने के लिए किया जाता है।

मैंने संसाधनों को इसके साथ परिभाषित किया: Stateless resourceऔर Stateful resource:

  • स्टेटलेस संसाधन इन संसाधनों के लिए, बस खाली शरीर के साथ HttpCode को वापस करें, यह पर्याप्त है।

  • स्टेटफुल रिसोर्स उदाहरण के लिए: संसाधन का संस्करण। इस तरह के संसाधनों के लिए, आपको जब आप इसे बदलना चाहते हैं, तो आपको संस्करण प्रदान करना होगा, इसलिए पूर्ण संसाधन लौटाएं या ग्राहक को संस्करण लौटाएं, इसलिए ग्राहक को अद्यतन कार्रवाई के बाद एक अनुरोध भेजने की आवश्यकता नहीं है।

लेकिन , एक सेवा या प्रणाली के लिए, रखने के यहsimple,clearly,easy to use and maintainसबसे महत्वपूर्ण बात है।


6
"PUT का उपयोग उस संसाधन को अपडेट करने के लिए किया जाता है जो नहीं बना या प्राप्त नहीं हुआ है।" - यह सच नहीं है और न ही आम है। युक्ति से, PUT संसाधन बना सकता है। स्पष्ट = सामान्यतः ज्ञात युक्ति का अनुसरण।
Imre Pühvel

-3

जैसे एक रिक्त अनुरोध निकाय GET अनुरोध के मूल उद्देश्य के अनुसार है और खाली प्रतिक्रिया निकाय PUT अनुरोध के मूल उद्देश्य के अनुसार है।


-3

ठीक लगता है ... हालांकि मुझे लगता है कि सफलता / विफलता / समय पोस्ट / # बाइट्स प्राप्त / आदि का एक अल्पकालिक संकेत होगा। बेहतर होगा।

संपादित करें: मैं डेटा अखंडता और / या रिकॉर्ड-कीपिंग की तर्ज पर सोच रहा था; मेटाडेटा जैसे कि MD5 हैश या टाइमस्टैम्प प्राप्त समय के लिए बड़े डेटाफ़ाइल्स के लिए सहायक हो सकता है।


1
कैसे लगभग 200 ठीक स्थिति प्रतिक्रिया हैडर में? लगता है कि यह कहने के लिए पर्याप्त है, "ठीक काम धन्यवाद?"
एंथनीवजोन

प्रतिक्रिया शीर्षलेख में स्थिति कोड होगा, और हाँ हम इस बिंदु पर HTTP के बारे में बात कर रहे हैं :)
AwkwardCoder

-4

आदर्श रूप से यह एक सफलता / असफल प्रतिक्रिया लौटाएगा।


13
हालांकि, प्रतिक्रिया निकाय में नहीं। HTTP स्टेटस कोड उसके लिए जगह है। हो सकता है कि अगर कोई त्रुटि हो तो कुछ विस्तारित त्रुटि जानकारी प्रतिक्रिया बोली में लौटाई जा सकती है

-4

HTTP प्रतिक्रिया के हेडर और बॉडी में अंतर होता है। PUT को कभी भी एक निकाय नहीं लौटाना चाहिए, लेकिन शीर्ष लेख में एक प्रतिक्रिया कोड अवश्य देना चाहिए। बस 200 का चयन करें यदि यह सफल था, और यदि नहीं तो 4xx। अशक्त रिटर्न कोड जैसी कोई चीज नहीं है। तुम ऐसा क्यों करना चाहते हो?

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.