क्या POST के बाद कंटेंट को वापस करना REST द्वारा ठीक है?


88

मैं रैस्टलेट का उपयोग कर रहा हूं और मैंने एक संसाधन बनाया है। मैं ओवरराइड करके POST को संभालता हूंacceptRepresentation विधि से ।

क्लाइंट को मुझे कुछ डेटा भेजना चाहिए, फिर मैं इसे डीबी पर स्टोर करता हूं, 201 (SUCCESS_CREATED) पर प्रतिक्रिया सेट करता हूं और मुझे क्लाइंट को कुछ डेटा वापस करने की आवश्यकता होती है, लेकिन टाइप का रिटर्न होता acceptRepresentationहै void

मेरे मामले में, मुझे कुछ पहचानकर्ता को वापस करने की आवश्यकता है ताकि ग्राहक उस संसाधन तक पहुंच सके।

उदाहरण के लिए, यदि मेरे पास URL के साथ एक संसाधन था /resourceऔर ग्राहक POST अनुरोध भेजता है तो मैं DB में एक नई पंक्ति जोड़ता हूं और इसका पता होना चाहिए /resource/{id}। मुझे भेजने की जरूरत है {id}

क्या मुझसे कुछ ग़लत हो रहा है? क्या REST सिद्धांत POST के बाद कुछ वापस करने की अनुमति देता है? यदि हाँ, तो मैं इसे कैसे कर सकता हूँ, और यदि नहीं तो इस स्थिति को संभालने का तरीका क्या है?


एक्सेप्ट रिप्रेसेंटेशन () के भीतर से रिस्पांस बॉडी कैसे सेट करें, इसके लिए थॉम्स का जवाब देखें।
एवि फ्लैक्स

जवाबों:


96

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

यदि मूल सर्वर पर एक संसाधन बनाया गया है, तो प्रतिक्रिया SHOULD 201 (बनाई गई) होनी चाहिए और इसमें एक इकाई शामिल होगी जो अनुरोध की स्थिति का वर्णन करती है और नए संसाधन को संदर्भित करती है, और एक स्थान हेडर (अनुभाग 14.30 देखें)।

जैसा कि आप इससे देख सकते हैं, आपके पास दो स्थान हैं जहाँ आप उस क्लाइंट को इंगित कर सकते हैं जहाँ नव निर्मित संसाधन रहता है। लोकेशन हेडर में एक URL होना चाहिए जो नए संसाधन को इंगित करता है और आप विवरण के साथ एक इकाई भी लौटा सकते हैं।

मुझे यकीन नहीं है कि ओवरराइडिंग रिक्रिएशन () और ओवरराइडिंग पोस्ट () के बीच क्या अंतर है, लेकिन यह उदाहरण दिखाता है कि पीओएसटी से प्रतिक्रिया कैसे लौटाई जाए।


2
@ डेल-ब्वॉय: थ्रेड का जवाब स्वीकार करें कि रिस्पेन्सेरिएशन () के भीतर से रिस्पांस बॉडी कैसे सेट करें।
एवी फ्लैक्स

1
HTTP स्पेक उद्धरण एक प्रतिक्रिया पर प्रतिबंध नहीं लगाता है, यदि आप धारा 6 में देखते हैं तो उस पर स्पष्ट है: इसकी अनुमति है:Request and Response messages MAY transfer an entity if not otherwise restricted by the request method or response status code. An entity consists of entity-header fields and an entity-body, although some responses will only include the entity-headers.
माइक '17

@ माइक यह अनुमान लगाने का मेरा उद्देश्य नहीं था कि एक प्रतिक्रिया निकाय को अनुमति नहीं दी गई थी। विशेष रूप से उद्धृत कल्पना का हिस्सा "और एक इकाई शामिल है"। मुझे अपने पाठ में स्पष्ट होना चाहिए था।
डारेल मिलर

16

मैं प्रतिक्रिया के शरीर में कुछ भी भेजना चाहता हूँ। बस स्थान सेट करें: नए बनाए गए संसाधन का (पूर्ण) URL।

आपका विवरण बताता है कि यह ठीक वही शब्दार्थ है जो आप:

  1. इसे बनाने के लिए POST एक चीज़ है
  2. दो बातों को जानने के लिए पर्याप्त उत्तर दें:
    1. कि सृजन हुआ (201)
    2. नई चीज़ कहां मिलेगी (स्थान शीर्षलेख)

और कुछ भी शानदार है।


ऐसा नहीं है कि विकिपीडिया हमेशा एक अच्छा स्रोत है, लेकिन यह भी दावा करता है कि "[...] एक नए बनाए गए संसाधन के स्थान के बारे में जानकारी प्रदान करने के लिए। इस परिस्थिति में, स्थान शीर्षक को 2018 या 202 के HTTP स्थिति कोड के साथ भेजा जाना चाहिए। । "
अर्जन

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

10

दो अलग-अलग प्रश्न:

क्या REST एप्लिकेशन पैटर्न किसी POST में डेटा लौटने का समर्थन करता है?

मुझे नहीं लगता कि REST इसे स्पष्ट रूप से अस्वीकार करता है, लेकिन पसंदीदा उपचार डारेल के उत्तर में दिया गया है।

क्या RESTlet फ्रेमवर्क POST में डेटा वापस करने की अनुमति देता है?

हाँ, भले ही यह शून्य लौटाता है, एक वर्ग में जो संसाधन का विस्तार करता है, आपके पास getResponse () विधि के माध्यम से रिस्पांस ऑब्जेक्ट ऑब्जेक्ट तक पूर्ण पहुंच है। तो आप getResponse ()। SetEntity () जो भी डेटा आप चाहते हैं के साथ कह सकते हैं।


6

जो भी अनुरोध किया जाता है, उसमें इसे आउटपुट करें। यह हो सकता है:

<success>
    <id>5483</id>
</success>

या:

{ "type": "success", "id": 5483 }

यह इस बात पर निर्भर करता है कि आप आमतौर पर क्या करते हैं। यदि वे डेटा की उम्मीद नहीं कर रहे हैं, तो उन्हें बस इसे अनदेखा करना चाहिए, लेकिन कोई भी ग्राहक जो इसे ठीक से संभालना चाहता है, उसे सक्षम होना चाहिए।


ठीक है, मेरे पास दो संभावित प्रारूप (html और xml) हैं। मुझे पता है कि अनुरोधित प्रारूप के प्रकार को कैसे संभालना है, लेकिन मुझे नहीं पता कि प्रतिक्रिया के लिए डेटा कैसे जोड़ा जाए। प्रतिनिधित्व विधि प्रतिनिधित्व प्रतिनिधित्व करता है, इसलिए मैं अभी जो चाहता हूं उसे वापस करता हूं, लेकिन स्वीकार करना शून्य विधि है, इसलिए मैं किसी भी डेटा को वापस नहीं कर सकता ...
डेल-ब्वॉय

1

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

यह संभावित भ्रम से बचना होगा - जिसमें एक ग्राहक (उचित रूप से) यह मान सकता है कि प्रतिक्रिया इकाई वास्तव में 'निर्माता' की एक नई स्थिति का प्रतिनिधित्व करती है, और निर्मित संसाधन नहीं।

> POST /collection
> ..new item..

< 201 Created
< Location: /collection/1354
< Content-Location: /collection/1354
< <div class="item">This is the new item that was created</div>

3
मुझे लगता है कि सामग्री-स्थान एक अलग उद्देश्य के लिए है। HTTP युक्ति कहता है कि सामग्री-स्थान POST और PUT के लिए परिभाषित नहीं है। लोकेशन हेडर का उपयोग 201-Create के साथ किया जाता है। किसी स्थान को वापस करना स्वचालित रूप से पुनर्निर्देशित नहीं करता है, आपको उसके लिए 3XX प्रतिक्रिया कोड की आवश्यकता होती है।
डारेल मिलर

1
स्थान हेडर का उपयोग किया जाता है (201 प्रतिक्रिया में) यह इंगित करने के लिए कि निर्मित संसाधन कहाँ स्थित है; यह प्रतिक्रिया के निकाय निकाय के साथ प्रासंगिक नहीं है जो यह साथ देता है। मेरा कहना यह था कि - यदि आप २०१ if की प्रतिक्रिया में खुद ही बनाए गए संसाधन को शामिल करना चाहते हैं (बजाय ग्राहक को किसी अन्य यूआरआई के निर्देशन / पुनर्निर्देशित करने के) तो एक कंटेंट-लोकेशन हेडर एक अच्छा विचार होगा। यह शायद 'नियमों को थोड़ा झुकना' है, लेकिन ग्राहक को नए संसाधन की स्थिति प्राप्त करने के लिए एक अन्य अनुरोध / प्रतिक्रिया चक्र की आवश्यकता से अधिक कुशल है।
माइक

मेरे लिए समझ में आता है। मैंने पहले कभी सामग्री-स्थान हेडर का उपयोग नहीं किया है।
डारेल मिलर

यदि क्लाइंट ब्राउज़र वाला मानव है, तो 201 का स्थान हेडर के साथ वापस आना कोई मायने नहीं रखता है। उपयोगकर्ता को यह नहीं पता होगा कि इसके साथ क्या करना है। यदि ग्राहक एक रोबोट है, तो उसे प्रोग्राम किया जा सकता है कि उससे कैसे निपटें - जैसे कि लोकेशन पर GET फॉलो अप करें।
विवादास्पद

3
@irreputable: मेरा मानना ​​है कि REST एपीआई को डिजाइन करने के लिए था, जहां A उपयोगकर्ता एजेंट के लिए नहीं खड़ा होता है जो रेंडर करने के लिए कुछ HTML खोजता है।
हर्म्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.