2009-12-02 8 views
71

मैं रीस्टलेट का उपयोग कर रहा हूं और मैंने एक संसाधन बनाया है। मैं स्वीकृति प्रस्तुत करने की विधि को ओवरराइड करके POST को संभालता हूं।क्या पोस्ट के बाद सामग्री वापस करने के लिए आरईएसटी द्वारा ठीक है?

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

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

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

क्या मैं कुछ गलत कर रहा हूं? क्या आरईएसटी सिद्धांत पोस्ट के बाद कुछ वापस करने की अनुमति देता है? यदि हां, तो मैं यह कैसे कर सकता हूं, और यदि इस स्थिति को संभालने का कोई तरीका नहीं है?

+0

थॉम के देखें जवाब()। –

उत्तर

76

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

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

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

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

+1

@ डेल-लड़का वापस नहीं कर सकते हैं: कैसे acceptRepresentation के भीतर से प्रतिक्रिया शरीर स्थापित करने के लिए के लिए थॉम के जवाब देखें()। –

+0

HTTP कल्पना बोली एक प्रतिक्रिया निषेध नहीं है, अगर आप धारा 6 में देखने के लिए यह है कि पर स्पष्ट है: यह अनुमति दी है: 'अनुरोध और प्रतिक्रिया संदेशों सकता है एक इकाई हस्तांतरण नहीं तो अन्यथा अनुरोध विधि या प्रतिसाद स्थिति कोड द्वारा प्रतिबंधित। एक इकाई में इकाई-हेडर फ़ील्ड और एक इकाई-बॉडी होती है, हालांकि कुछ प्रतिक्रियाओं में केवल इकाई-शीर्षलेख शामिल होंगे। – MikeF

+0

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

4

जो भी प्रारूप अनुरोध किया गया है उसे आउटपुट करें। यही कारण है कि हो सकता है:

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

या:

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

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

+0

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

9

दो अलग अलग सवाल:

करता है बाकी आवेदन पैटर्न एक पोस्ट में डेटा लौटने समर्थन करते हैं?

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

क्या रीस्टलेट ढांचा एक पोस्ट में डेटा लौटने की अनुमति देता है?

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

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 spec का कहना है कि सामग्री-स्थान POST और PUT के लिए परिभाषित नहीं है। स्थान शीर्षलेख 201-निर्माण के साथ उपयोग किया जाता है। किसी स्थान को लौटने से स्वचालित रूप से रीडायरेक्ट नहीं होता है, इसके लिए आपको 3XX प्रतिक्रिया कोड की आवश्यकता होती है। –

+1

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

+0

मुझे समझ में आओ। मैंने पहले कभी सामग्री-स्थान शीर्षलेख का उपयोग नहीं किया है। –

11

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

आपका वर्णन चलता है कि यह वास्तव में अर्थ विज्ञान आप है:

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

कुछ और आवश्यक नहीं है। कैसे acceptRepresentation के भीतर से प्रतिक्रिया शरीर स्थापित करने के लिए के लिए

+0

नहीं कि विकिपीडिया हमेशा एक अच्छा स्रोत है, लेकिन [that] (https://en.wikipedia.org/wiki/HTTP_location) भी दावा करता है _ "[...] नव निर्मित संसाधन के स्थान के बारे में जानकारी प्रदान करने के लिए। इस परिस्थिति में, स्थान शीर्षलेख 201 या 202 के HTTP स्थिति कोड के साथ भेजा जाना चाहिए। "_ – Arjan

+0

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

संबंधित मुद्दे