LastUser
और LastUpdate
क्लाइंट द्वारा संशोधित नहीं हैं, मैं उन्हें आपके संसाधन के प्रतिनिधित्व से पूरी तरह से हटा दूंगा। मुझे एक उदाहरण के साथ अपने तर्क की व्याख्या करने दें। शायद ले
GET /example/123
<?xml version="1.0" encoding="UTF-8" ?>
<example>
<id>123</id>
<lorem>ipsum</lorem>
<dolor>sit amet</dolor>
<lastUser uri="/user/321">321</lastUser>
<lastUpdate>2011-04-16 20:00:00 GMT</lastUpdate>
</example>
एक ग्राहक संसाधन को संशोधित करना चाहता है, यह होगा:
कहते हैं कि हमारे विशिष्ट उदाहरण एपीआई जब एक ही संसाधन देने के लिए कहा ग्राहक के लिए निम्न प्रतिनिधित्व वापस आ जाएगी चलो संपूर्ण प्रतिनिधित्व और इसे वापस एपीआई को भेजें।
PUT /example/123
<?xml version="1.0" encoding="UTF-8" ?>
<example>
<id>123</id>
<lorem>foobar</lorem>
<dolor>foobaz</dolor>
<lastUser>322</lastUser>
<lastUpdate>2011-04-16 20:46:15 GMT+2</lastUpdate>
</example>
के बाद से एपीआई lastUser
और lastUpdate
स्वचालित रूप से के लिए मान उत्पन्न करता है और ग्राहक द्वारा उपलब्ध कराए गए आंकड़ों स्वीकार नहीं कर सकते, सबसे उचित प्रतिक्रिया होगी 400 Bad Request
या 403 Forbidden
(के बाद से ग्राहक इन मूल्यों को संशोधित नहीं कर सकते)।
हम बाकी के अनुरूप हो सकता है और जब एक PUT अनुरोध कर रही संसाधन की एक पूरी प्रतिनिधित्व भेजना चाहते हैं, तो हम संसाधन के प्रतिनिधित्व से lastUser
और lastUpdate
दूर करने के लिए की जरूरत है। यह ग्राहकों PUT के माध्यम से पूर्ण इकाई भेजने के लिए अनुमति देगा:
PUT /example/123
<?xml version="1.0" encoding="UTF-8" ?>
<example>
<id>123</id>
<lorem>foobar</lorem>
<dolor>foobaz</dolor>
</example>
सर्वर अब है कि यह lastUpdate
और lastUser
शामिल नहीं है एक पूर्ण प्रतिनिधित्व स्वीकार करेंगे।
प्रश्न यह है कि यह बनी हुई है कि ग्राहकों को lastUpdate
और lastUser
तक पहुंच प्रदान करें। अगर उन्हें इसकी आवश्यकता नहीं है (और इन क्षेत्रों को केवल एपीआई द्वारा आंतरिक रूप से आवश्यक है), तो हम ठीक हैं और हमारा समाधान पूरी तरह से विश्वसनीय है।यदि फिर भी ग्राहकों को इस डेटा का एक्सेस जरूरत है, साफ दृष्टिकोण HTTP हेडर का उपयोग होगा क्योंकि उपयोगकर्ता एजेंटों इसे पढ़ने के पर सिखाने की जरूरत है
GET /example/123
...
Last-Modified: Sat, 16 Apr 2011 18:46:15 GMT
X-Last-User: /user/322
...
<?xml version="1.0" encoding="UTF-8" ?>
<example>
<id>123</id>
<lorem>foobar</lorem>
<dolor>foobaz</dolor>
</example>
एक कस्टम HTTP शीर्षक का प्रयोग आदर्श नहीं है। यदि हम ग्राहकों को एक ही डेटा तक अधिक आसान तरीके से पहुंच प्रदान करना चाहते हैं, तो केवल एक चीज जिसे हम कर सकते हैं, डेटा को प्रतिनिधित्व में रखना है, और हम आपके मूल प्रश्न के समान समस्या का सामना कर रहे हैं। मैं कम से कम इसे किसी भी तरह कम करने की कोशिश करता हूं।
GET /example/123
...
Last-Modified: Sat, 16 Apr 2011 18:46:15 GMT
...
<?xml version="1.0" encoding="UTF-8" ?>
<example last-update="2011-04-16 18:46:15 GMT" last-user="/user/322">
<id>123</id>
<lorem>foobar</lorem>
<dolor>foobaz</dolor>
</example>
इस तरह हम कम से कम समस्या से बचने जाएगा, जहां एक ग्राहक: सामग्री एपीआई द्वारा इस्तेमाल किया प्रकार एक्सएमएल है, तो हम डेटा नोड के बजाय उन्हें सीधे उजागर नोड मूल्यों के रूप में की विशेषताओं, यानी में डाल सकते हैं फॉलो-अप पुट अनुरोध में सभी एक्सएमएल नोड्स जमा करने का प्रयास करेंगे। यह JSON के साथ काम नहीं करेगा, और समाधान अभी भी idempotency के किनारे पर थोड़ा सा है (चूंकि अनुरोध को संसाधित करते समय एपीआई को अभी भी XML विशेषताओं को अनदेखा करना होगा)।
और भी बेहतर, के रूप में Jonah टिप्पणी में कहा, अगर ग्राहकों lastUser
और lastUpdate
के लिए उपयोग की जरूरत है, इन एक नया संसाधन के रूप में, उजागर किया जा सकता है मूल एक जैसे से जुड़ा हुआ इस प्रकार है:
GET /example/123
<?xml version="1.0" encoding="UTF-8" ?>
<example>
<id>123</id>
<lorem>foobar</lorem>
<dolor>foobaz</dolor>
<lastUpdateUri>/example/123/last-update</lastUpdateUri>
</example>
... और फिर:
GET /example/123/last-update
<?xml version="1.0" encoding="UTF-8" ?>
<lastUpdate>
<resourceUri>/example/123</resourceUri>
<updatedBy uri="/user/321">321</updatedBy>
<updatedAt>2011-04-16 20:00:00 GMT</updatedAt>
</lastUpdate>
(। ऊपर भी हो सकता है अच्छी तरह से अलग-अलग परिवर्तन के साथ एक पूर्ण ऑडिट लॉग प्रदान करने के लिए, उपलब्ध कराने के एक संसाधन के बदलाव का उपलब्ध है विस्तार)
कृपया ध्यान दें:
मैं Darrel Miller के take on the question से सहमत हैं, लेकिन मैं समर्थक चाहते थे इसके शीर्ष पर एक अलग दृष्टिकोण के माध्यम से। ध्यान दें कि इस दृष्टिकोण का समर्थन किसी भी मानक/आरएफसी/आदि द्वारा समर्थित नहीं है, यह समस्या पर एक अलग लेना है।
आप 'LastUser' और' LastUpdate' का प्रतिनिधित्व कैसे करते हैं - क्या वे आपके संसाधन प्रतिनिधित्व (यानी XML में नोड्स) का हिस्सा हैं? – MicE
नहीं, वे अद्यतन जारी करते समय भी मौजूद नहीं होते हैं, लेकिन जब मैं प्राप्त करने के साथ पूछताछ करता हूं तो मैं उन्हें वापस भेजता हूं .... इसलिए मैं एक पुट करता हूं, और फिर एक प्राप्त करता हूं, और मुझे अंतिम अद्यतन समय मिलता है, मैं फिर से वही जारी करता हूं पुट, और एक और जीईटी एक अलग अंतिम अद्यतन उत्पन्न करता है ... – opensas
ठीक है, पुष्टि के लिए धन्यवाद - समस्या पर वैकल्पिक लेने के लिए नीचे मेरा उत्तर देखें। – MicE