2010-08-11 31 views
6

हमारे RESTful API का हिस्सा उपयोगकर्ताओं को एक सीरियल नंबर के साथ एक आइटम पंजीकृत करने की अनुमति देगा। चूंकि धारावाहिक संख्या वैश्विक रूप से अद्वितीय नहीं है, इसलिए इसे संसाधन के पहचानकर्ता के रूप में उपयोग नहीं किया जा सकता है, इसलिए हम मूल संसाधन में एक पोस्ट का उपयोग करेंगे जो पहचानकर्ता उत्पन्न करेगा, उदा।एक idempotent HTTP POST अनुरोध

POST /my/items 

<item serial-number="ABCDEF" /> 

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

HTTP 201 Created 
Location: /my/items/1234  

<item id="1234" serial-number="ABCDEF" /> 

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

HTTP 200 OK 
Content-Location: /my/items/1234  

<item id="1234" serial-number="ABCDEF" /> 

क्या यह उचित लगता है? मैं पूरी तरह से स्पष्ट नहीं हूं कि स्थान या सामग्री-स्थान दूसरे मामले में अधिक उपयुक्त है या नहीं।

उत्तर

7

मुझे हाल ही में इसी तरह की आवश्यकता थी। बेवकूफ संचालन के लिए PUT सबसे अच्छा तरीका है। आप सही हैं कि बाह्य-आईडी और आंतरिक एक के बीच एक मेल नहीं है। मैं बाहरी आईडी लक्ष्य के लिए एक समर्पित संसाधन बनाने के द्वारा इसे हल:

PUT /api-user/{username}/items/{serialNumber} 

आंतरिक मैं इसे मामले में एक बनाएँ के रूप में हल मैं मैं क्या मामले में 'उपयोगकर्ता नाम' और 'ABCDEF' सीरियल नंबर या अद्यतन के लिए कोई आइटम ।

यदि यह एक क्रिएट था, तो मैं एक अद्यतन 200 के लिए 201 लौटाता हूं। इसके अलावा लौटा हुआ पेलोड में होमग्राउन आईडी और आपके पेलोड में सुझाए गए बाहरी सीरियल नंबर दोनों शामिल हैं।

+0

हम्म हां वास्तव में मुझे यह पसंद है। यद्यपि धारावाहिक संख्या वैश्विक रूप से अद्वितीय नहीं हो सकती है, लेकिन लगभग 100% संभावना है कि वे उपयोगकर्ता के दायरे में अद्वितीय होंगे ताकि यह एक विशिष्ट अद्वितीय पहचानकर्ता के रूप में कार्य कर सके। यह मेरी समस्या को हल करेगा कि डिवाइस कैसे जांच सकता है कि यह पहले से ही इस यूआरएल पर एक जीईटी का उपयोग करके पंजीकृत है और यह जांच रहा है कि प्रतिक्रिया 200 या 404 है। धन्यवाद! –

1

Here दो शीर्षकों के उपयोग पर एक दिलचस्प चर्चा है। यह दावा करता है कि सामग्री-स्थान को PUT या POST के लिए परिभाषित नहीं किया गया है, इसलिए संभवतः स्थान आपके मामले में बेहतर विकल्प है। यह निश्चित रूप से स्पष्ट कट नहीं है जो हालांकि बेहतर है।

कुल मिलाकर मुझे लगता है कि आपका दृष्टिकोण समझ में आता है।

+0

यह लेख थोड़ा सा गायब है जब यह कहता है कि सामग्री-स्थान PUT और POST के लिए परिभाषित नहीं है, HTTP spec वास्तव में कहता है कि यह अनुरोधों के लिए परिभाषित नहीं है लेकिन प्रतिक्रियाओं के बारे में कुछ भी नहीं कहता है। मुझे लगता है कि यह सही कह सकता है कि सामग्री-स्थान वैकल्पिक रूपों के लिए है, जबकि स्थान वास्तविक स्थान है। Spec से सुनिश्चित करने में मुश्किल: -एस –

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