เราจำเป็นต้องส่งข้อมูลบทความทั้งหมดกลับไปที่ API เพื่ออัปเดตและไม่สามารถใช้งานผู้ใช้หลายคนได้ ตัวอย่างเช่นผู้แก้ไขสามารถส่งข้อมูลที่เก่ากว่า 5 วินาทีและเขียนทับการแก้ไขที่นักข่าวคนอื่นเพิ่งทำเมื่อ 2 วินาทีที่แล้วและไม่มีทางที่ฉันจะอธิบายให้ลูกค้าฟังได้เนื่องจากผู้เผยแพร่บทความไม่ได้เชื่อมต่อกับการปรับปรุงเนื้อหา
สิ่งนี้เป็นเรื่องที่ท้าทายไม่ว่าคุณจะทำอะไรมันเป็นปัญหาที่คล้ายกันมากกับการควบคุมแหล่งสัญญาณแบบกระจาย (Mercurial, git, ฯลฯ ) และวิธีแก้ปัญหาที่สะกดใน 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}
เพื่อทำการสร้างอลิซถูกเปลี่ยนเส้นทางไปยัง URL ของบทความ / เวอร์ชั่นที่เธอจะสร้างขึ้นผู้ใช้ของอลิซ ตัวแทนจะนำคำขอไปใช้ใหม่ตามที่อยู่ใหม่
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
Bob มองไปที่นั่น:
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 จริง เพื่อลดรอบคำขอ / การตอบกลับ
api/article?action=publish
? พารามิเตอร์การสืบค้นมีไว้สำหรับกรณีเช่นนี้ซึ่งสถานะของทรัพยากรนั้นขึ้นอยู่กับ 'อัลกอริทึม' (หรือการกระทำ) ที่คุณพูดถึง เช่นapi/articles?sort=asc
ถูกต้อง