एक सम्मेलन द्वारा क्या पुस्ट / POST / DELETE कॉल लौटनी चाहिए?


153
  1. "REST विचारधारा" के अनुसार PUT / POST / DELETE अनुरोधों के लिए प्रतिक्रिया निकाय में क्या होना चाहिए?

  2. रिटर्न कोड के बारे में क्या? है HTTP_OKपर्याप्त?

  3. ऐसे सम्मेलनों का क्या कारण है, यदि कोई हो?

मैंने POST / PUT के अंतर का वर्णन करते हुए एक अच्छा पोस्ट पाया है: POST बनाम PUT लेकिन यह अभी भी मेरे सवाल का जवाब नहीं देता है।

जवाबों:


130

फ़्लिपेंसी को माफ़ कर दें, लेकिन अगर आप HTTP पर REST कर रहे हैं तो फ़्लिपेंसी को RFC7231 वर्णन करता है कि GET, PUT, POST और DELETE से क्या व्यवहार अपेक्षित है।

अद्यतन (जुलाई 3 '14):
HTTP कल्पना जानबूझकर यह परिभाषित नहीं करती है कि POST या DELETE से क्या लौटा है। कल्पना केवल परिभाषित करती है कि क्या परिभाषित करने की आवश्यकता है। बाकी को चयनकर्ता को चुनने के लिए छोड़ दिया जाता है।


9
@tuxslayer मुझे खुशी है कि आपको नहीं लगा कि मैं सिर्फ झपकी लेने की कोशिश कर रहा हूं। कई लोगों को लगता है कि REST HTTP तरीकों के शीर्ष पर अतिरिक्त आवश्यकताओं को जोड़ता है। हालांकि, यह मामला नहीं है। अतिरिक्त बाधाएं हैं, लेकिन वे वास्तव में HTTP तरीकों के व्यवहार को प्रभावित नहीं करते हैं। RFC2616 निश्चित रूप से पालन करने के लिए गाइड है।
डारेल मिलर

4
मैं लिंक की सराहना करता हूं। :) इसने मुझे रोक दिया और उस उपकरण के बारे में सोचें जिसका मैं उपयोग कर रहा हूं। आपकी पोस्ट, और RFC को पढ़ने के बाद, मैंने खुद को RFC की बाकी रात का जिक्र करते हुए पाया। यह मुझे एक HTTP प्रक्रिया के रूप में प्रक्रिया के बारे में सोचने में मदद करता है पहला, और बाकी प्रक्रिया दूसरी है। बहुत सराहना की।
पेरी टिव

4
@PerryTew अब आप यहां टूल्स . ietf.org/wg/httpbis पर जा सकते हैं और वर्तमान में HTTP कल्पना का संशोधित संस्करण देख सकते हैं । का आनंद लें!
डैरेल मिलर

12
शायद मुझे बस अधिक नींद की आवश्यकता है, लेकिन मुझे सटीक जानकारी नहीं मिल पा रही है कि ओपी ने आरएफसी के भीतर पूछा। POST या DELETE प्रतिक्रिया के लिए शरीर क्या होना चाहिए?
कैम जैक्सन

9
खैर, यह कीचड़ के रूप में स्पष्ट है। शायद उत्तर में कुछ और जानकारी सहायक होगी। विशेषकर, जब वह लिंक मृत हो।
डग मोलेनक्स

25

कुल मिलाकर, कन्वेंशन "लगता है जैसे आप सिर्फ वेब पेज डिलीवर कर रहे हैं"।

PUT के लिए, मैं वही दृश्य वापस करूंगा जो आपको मिलेगा अगर आपने तुरंत GET किया; इसके परिणामस्वरूप 200 (ठीक है, यह मानते हुए कि प्रतिपादन सफल होगा)। एक पोस्ट के लिए, मैं बनाए गए संसाधन पर पुनर्निर्देशित करूँगा (यह मानते हुए कि आप एक निर्माण कार्य कर रहे हैं; यदि नहीं, तो केवल परिणाम लौटाएँ) एक सफल बनाने के लिए कोड एक 201 है, जो कि वास्तव में केवल एक पुनर्निर्देशित के लिए HTTP कोड है जो 300 रेंज में नहीं है।

मैं कभी भी इस बारे में खुश नहीं था कि एक DELETE को क्या लौटना चाहिए (मेरा कोड इस समय HTTP 204 और एक खाली निकाय का उत्पादन करता है)।


1
PUTअनुरोध वापस करने के बाद अगला पृष्ठ एक बुरे अभ्यास की तरह लगता है, क्योंकि परिणामी पृष्ठ पर ताज़ा करने से अनुरोध फिर से निष्पादित हो जाएगा। मेरे बजाय, यह समझ में आता है कि आप एक पुनर्निर्देशित करते हैं, यह मानते हुए कि आप तुल्यकालिक अनुरोधों के साथ काम कर रहे हैं।
लोबती

1
@lobati मुझे लगता है कि यह ध्यान रखना महत्वपूर्ण है कि कई समान PUT अनुरोध भेजना, ठीक उसी परिणाम के रूप में होना चाहिए, जिसमें एक ही PUT अनुरोध भेजा जा रहा है। शायद आप जिस मुद्दे को उठा रहे हैं वह अब ऊपर दिए गए कम महत्वपूर्ण है?
इयान

3
@ मैं वास्तव में नहीं। समस्या यह है कि अगर कुछ और बाद में रिकॉर्ड को अपडेट करता है, तो आप नहीं चाहेंगे कि यह एक और PUTअनुरोध भेजे जिससे डेटा वापस हो। उदाहरण के लिए, यदि दो लोग एक ही पृष्ठ को संदर्भित कर रहे हैं, एक अपडेट करता है, तो दूसरा एक अपडेट करता है, यदि पहला व्यक्ति परिणाम देखने के लिए रिफ्रेश करता है, तो यह वास्तव में समाप्त हो जाएगा, जिससे दूसरे व्यक्ति द्वारा किए जाने से पहले चीजों को वापस कर दिया जाए। उनके परिवर्तन।
लोबाती

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

3

संसाधन बनाना आमतौर पर POST के लिए मैप किया जाता है, और जिसे नए संसाधन का स्थान वापस करना चाहिए; उदाहरण के लिए, एक रेल में पाड़ एक सृजन नए बनाए गए संसाधन के लिए SHOW को पुनर्निर्देशित करेगा। एक ही दृष्टिकोण अपडेट (PUT) के लिए समझ में आता है, लेकिन यह एक सम्मेलन से कम है; एक अद्यतन को केवल सफलता की आवश्यकता है। एक हटाना शायद केवल सफलता को इंगित करने की आवश्यकता है; यदि आप पुनर्निर्देशित करना चाहते हैं, तो संसाधनों का LIST लौटाना संभवतः सबसे अधिक समझ में आता है।

HTTP_OK द्वारा सफलता का संकेत दिया जा सकता है, हाँ।

जो मैंने ऊपर कहा है, उसमें केवल कठिन और तेज़ नियम यह है कि एक सृजन को नए संसाधन का स्थान वापस करना चाहिए। ऐसा लगता है कि मेरे लिए कोई दिमाग नहीं; यह सही समझ में आता है कि ग्राहक को नई वस्तु तक पहुंचने में सक्षम होना चाहिए।


2
आपने वास्तव में PUT और POST को मिलाया है। POST का उपयोग बनाने के लिए किया जाता है, PUT का उपयोग अपडेट करने (और बनाने) के लिए किया जाता है। यह भी ध्यान देने योग्य है कि PUT को बेरोजगार होना चाहिए जबकि POST नहीं है।
स्टीव

एक बढ़िया आदेश ठीक से काम करना चाहिए लेकिन कई बार आप इसे चलाते हैं। तो आप किसी भी नकारात्मक दुष्प्रभावों के बिना एक ही "अद्यतन" को लागू करने के लिए एक ही PUT कई बार करने में सक्षम होना चाहिए।
याकूब मैटिसन

1

RFC7231 से यह कोई फर्क नहीं पड़ता है और खाली हो सकता है

हम परियोजना में json एपीआई मानक आधारित समाधान कैसे लागू करते हैं:

पोस्ट / पुट: प्राप्त वस्तु गुण विशेषताओं को प्राप्त करें (फ़ील्ड फ़िल्टर / संबंध समान लागू होते हैं)

हटाएं: डेटा में केवल शून्य होता है (इसके लापता वस्तु का प्रतिनिधित्व के लिए)

मानक हटाने के लिए स्थिति: 200


0

मुझे अद्यतन और हटाने के लिए HTTP स्थिति कोड से Alfonso Tienda responce पसंद है ?

यहाँ कुछ युक्तियाँ हैं:

हटाएँ

  • 200 (यदि आप प्रतिक्रिया में कुछ अतिरिक्त डेटा भेजना चाहते हैं) या 204 (अनुशंसित)।

  • 202 हटाए गए ऑपरेशन अभी तक प्रतिबद्ध नहीं हैं।

  • यदि डिलीट करने के लिए कुछ नहीं है, तो 204 या 404 का उपयोग करें (DELETE ऑपरेशन, बेरोजगार है, पहले से हटाए गए आइटम को हटा दें ऑपरेशन सफल है , इसलिए आप 204 को वापस कर सकते हैं , लेकिन यह सच है कि idempotent जरूरी नहीं है कि समान प्रतिक्रिया हो)

अन्य त्रुटियां:

  • 400 खराब अनुरोध (विकृत सिंटैक्स या एक खराब क्वेरी अजीब लेकिन संभव है)।
  • 401 अनधिकृत प्रमाणीकरण विफलता
  • 403 निषिद्ध : प्राधिकरण की विफलता या अमान्य एप्लिकेशन आईडी।
  • 405 अनुमति नहीं है । ज़रूर।
  • 409 संसाधन संघर्ष जटिल प्रणालियों में संभव हो सकता है।
  • और 501 , 502 त्रुटियों के मामले में।

डाल

यदि आप किसी संग्रह का एक तत्व अपडेट कर रहे हैं

  • 200/204 ऊपर दिए गए DELETE के समान कारणों के साथ।
  • 202 यदि ऑपरेशन अभी तक शुरू नहीं किया गया है।

संदर्भित तत्व मौजूद नहीं है:

  • PUT 201 हो सकता है (यदि आपने तत्व बनाया है क्योंकि यह आपका व्यवहार है)

  • 404 यदि आप PUT के माध्यम से तत्व नहीं बनाना चाहते हैं।

  • 400 बुरा अनुरोध (विकृत सिंटैक्स या एक खराब क्वेरी DELETE के मामले की तुलना में अधिक सामान्य)।

  • 401 अनधिकृत

  • 403 निषिद्ध : प्रमाणीकरण विफलता या अमान्य एप्लिकेशन आईडी।

  • 405 अनुमति नहीं है । ज़रूर।

  • 409 संसाधन संघर्ष जटिल प्रणालियों में संभव हो सकता है, जैसा कि DELETE में है।

  • 422 असंगत इकाई यह "खराब अनुरोध" (जैसे विकृत XML / JSON) और अमान्य फ़ील्ड मानों के बीच अंतर करने में मदद करता है

  • और 501 , 502 त्रुटियों के मामले में।

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