chúng tôi cần gửi tất cả dữ liệu bài viết trở lại API để cập nhật và công việc nhiều người dùng không thể thực hiện được. Ví dụ, trình chỉnh sửa có thể gửi dữ liệu cũ hơn 5 giây và ghi đè lên bản sửa lỗi mà một số nhà báo khác mới làm cách đây 2 giây và tôi không thể giải thích cho khách hàng điều này vì những bài báo đó thực sự không liên quan đến việc cập nhật nội dung.
Loại vấn đề này là một thách thức cho dù bạn có làm gì đi chăng nữa, Đó là một vấn đề rất giống với kiểm soát nguồn phân tán (mercurial, git, v.v.) và giải pháp, được đánh vần bằng HTTP / ReST, trông hơi giống nhau.
Giả sử bạn đã có hai người dùng, Alice và Bob, cả hai đều làm việc /articles/lunch
. (để rõ ràng, phản ứng là trong khuôn mặt táo bạo)
Đầu tiên, alice tạo ra bài viết.
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
Máy chủ không tạo tài nguyên, vì không có "phiên bản" nào được đính kèm với yêu cầu, (giả sử là định danh của /articles/{id}/{version}
. Để thực hiện việc tạo, Alice đã được chuyển hướng đến url của bài viết / phiên bản mà cô ấy sẽ tạo. Đại lý sau đó sẽ áp dụng lại yêu cầu tại địa chỉ mới.
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
Và bây giờ bài viết đã được tạo ra. tiếp theo, bob nhìn vào bài báo:
GET /articles/lunch HTTP/1.1
Host: example.com
Authorization: Basic Ym9iOnBhc3N3b3Jk
301 Moved Permanently
Location: /articles/lunch/1
Bob nhìn ở đó:
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?
Anh quyết định thêm sự thay đổi của chính mình.
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
Như với Alice, Bob được chuyển hướng đến nơi anh sẽ tạo ra một phiên bản mới.
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
Cuối cùng, Alice quyết định rằng cô muốn thêm vào bài viết của mình:
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.
Thay vì được chuyển hướng như bình thường, một mã trạng thái khác được trả về máy khách, thông báo 409
cho Alice rằng phiên bản mà cô đang cố gắng phân nhánh đã được phân nhánh. Các tài nguyên mới được tạo ra bằng mọi cách (như được hiển thị bởi Location
tiêu đề) và sự khác biệt giữa hai tài nguyên được bao gồm trong phần phản hồi. Alice bây giờ biết rằng yêu cầu cô vừa thực hiện cần phải được hợp nhất một số cách.
Tất cả các chuyển hướng này có liên quan đến ngữ nghĩa của PUT
, đòi hỏi các tài nguyên mới được tạo chính xác nơi dòng yêu cầu yêu cầu. điều này cũng có thể lưu chu kỳ yêu cầu bằng cách sử dụng POST
thay vào đó, nhưng sau đó số phiên bản sẽ phải được mã hóa theo yêu cầu bởi một số phép thuật khác, điều này dường như ít rõ ràng hơn đối với mục đích minh họa, nhưng có lẽ vẫn được ưa thích trong API thực để giảm thiểu chu kỳ yêu cầu / đáp ứng.
api/article?action=publish
vậy? Các tham số truy vấn được dành cho các trường hợp như vậy trong đó trạng thái của tài nguyên phụ thuộc vào 'thuật toán' (hoặc hành động) mà bạn đề cập. Ví dụ:api/articles?sort=asc
hợp lệ