हमें अद्यतन करने के लिए एपीआई पर सभी लेख डेटा वापस भेजने की आवश्यकता है और बहुउपयोगी कार्य को लागू नहीं किया जा सकता है। उदाहरण के लिए, संपादक 5 सेकंड पुराना डेटा भेज सकता है और यह तय कर सकता है कि कुछ अन्य पत्रकार ने सिर्फ 2 सेकंड पहले किया था और कोई रास्ता नहीं है कि मैं ग्राहकों को समझा सकता हूं क्योंकि लेख प्रकाशित करने वाला वास्तव में किसी भी तरह से सामग्री को अपडेट करने से जुड़ा नहीं है।
इस तरह की बात यह है कि आप जो भी करते हैं, वह एक चुनौती है, यह वितरित स्रोत नियंत्रण (मर्क्यूरियल, गिट, आदि) के लिए एक समान समस्या है, और समाधान, HTTP / ReST में वर्तनी, थोड़ा समान दिखता है।
मान लें कि आपको दो उपयोगकर्ता मिले हैं, ऐलिस और बॉब, दोनों काम कर रहे हैं /articles/lunch
। (स्पष्टता के लिए, प्रतिक्रिया निर्भीक है)
सबसे पहले, ऐलिस लेख बनाता है।
PUT /articles/lunch HTTP/1.1
Host: example.com
Content-Type: text/plain
Authorization: Basic YWxpY2U6c2VjcmV0
Hey Bob, what do you want for lunch today?
301 Moved Permanently
Location: /articles/lunch/1
सर्वर ने एक संसाधन नहीं बनाया, क्योंकि अनुरोध के साथ कोई "संस्करण" नहीं जुड़ा था, (पहचानकर्ता मानकर) /articles/{id}/{version}
सृजन करने के लिए, ऐलिस को उस लेख / संस्करण के यूआरएल पर रीडायरेक्ट किया गया था जिसे वह बना रहा होगा। ऐलिस का उपयोगकर्ता। एजेंट नए पते पर फिर से अनुरोध करेगा।
PUT /articles/lunch/1 HTTP/1.1
Host: example.com
Content-Type: text/plain
Authorization: Basic YWxpY2U6c2VjcmV0
Hey Bob, what do you want for lunch today?
201 Created
और अब लेख बनाया गया है। अगला, बॉब लेख को देखता है:
GET /articles/lunch HTTP/1.1
Host: example.com
Authorization: Basic Ym9iOnBhc3N3b3Jk
301 Moved Permanently
Location: /articles/lunch/1
बॉब वहां दिखता है:
GET /articles/lunch/1 HTTP/1.1
Host: example.com
Authorization: Basic Ym9iOnBhc3N3b3Jk
200 Ok
Content-Type: text/plain
Hey Bob, what do you want for lunch today?
वह अपना परिवर्तन जोड़ने का फैसला करता है।
PUT /articles/lunch/1 HTTP/1.1
Host: example.com
Content-Type: text/plain
Authorization: Basic Ym9iOnBhc3N3b3Jk
Hey Bob, what do you want for lunch today?
Does pizza sound good to you, Alice?
301 Moved Permanently
Location: /articles/lunch/2
ऐलिस के साथ, बॉब को पुनर्निर्देशित किया जाता है, जहां वह एक नया संस्करण तैयार करेगा।
PUT /articles/lunch/2 HTTP/1.1
Host: example.com
Content-Type: text/plain
Authorization: Basic Ym9iOnBhc3N3b3Jk
Hey Bob, what do you want for lunch today?
Does pizza sound good to you, Alice?
201 Created
अंत में, एलिस ने फैसला किया कि वह अपने लेख में जोड़ना चाहेगी:
PUT /articles/lunch/1 HTTP/1.1
Host: example.com
Content-Type: text/plain
Authorization: Basic YWxpY2U6c2VjcmV0
Hey Bob, what do you want for lunch today?
I was thinking about getting Sushi.
409 Conflict
Location: /articles/lunch/3
Content-Type: text/diff
---/articles/lunch/2
+++/articles/lunch/3
@@ 1,2 1,2 @@
Hey Bob, what do you want for lunch today?
-Does pizza sound good to you, Alice?
+I was thinking about getting Sushi.
सामान्य के रूप में पुनर्निर्देशित किए जाने के बजाय, एक अलग स्थिति कोड क्लाइंट को वापस कर दिया जाता है 409
, जो ऐलिस को बताता है कि वह जिस संस्करण से शाखा करने की कोशिश कर रहा था, वह पहले से ही शाखा में है। नए संसाधनों को वैसे भी बनाया गया था (जैसा कि Location
हेडर द्वारा दिखाया गया है ), और प्रतिक्रिया बॉडी में दोनों के बीच अंतर शामिल था। ऐलिस अब जानती है कि उसने जो अनुरोध किया था, उसे कुछ विलय करने की आवश्यकता है।
यह सभी पुनर्निर्देशन के शब्दार्थों से संबंधित है PUT
, जिसके लिए नए संसाधनों का निर्माण ठीक उसी तरह होना चाहिए, जहां अनुरोध रेखा पूछती है। यह POST
इसके बजाय एक अनुरोध चक्र को भी बचा सकता है , लेकिन फिर संस्करण संख्या को किसी अन्य जादू द्वारा अनुरोध में एनकोड करना होगा, जो मुझे चित्रण के प्रयोजनों के लिए कम स्पष्ट लग रहा था, लेकिन शायद अभी भी एक वास्तविक एपीआई में पसंद किया जाएगा अनुरोध / प्रतिक्रिया चक्र को कम करने के लिए।
api/article?action=publish
? क्वेरी पैरामीटर ऐसे मामलों के लिए अभिप्रेत हैं जहाँ संसाधन की स्थिति आपके द्वारा उल्लिखित 'एल्गोरिथम' (या क्रिया) पर निर्भर है। जैसेapi/articles?sort=asc
वैध है