2013-02-03 25 views
7

Tôi đã thực hiện khóa lạc quan cho các tài nguyên REST của tôi có ánh xạ 1 đến 1 cho các bảng cơ sở dữ liệu bằng cách trả về một số phiên bản trong GET trở lại cuộc gọi PUT. Nếu số phiên bản thay đổi trong cơ sở dữ liệu giữa thời gian tôi đã thực hiện GET và PUT, thì một ngoại lệ khóa lạc quan đã xảy ra. Thiết kế khá đơn giản.Làm cách nào để bạn triển khai khóa lạc quan hạt mịn trong REST?

Bây giờ, làm cách nào để làm tương tự cho các tài nguyên REST tổng hợp ánh xạ tới nhiều bảng cơ sở dữ liệu? Tôi không muốn phải trả lại nhiều trường phiên bản (một cho mỗi bảng dữ liệu có liên quan đến tài nguyên tổng hợp). Một ví dụ đơn giản của một tài nguyên tổng hợp sẽ là/FooBar trong đó/Foo và/Bar là các tài nguyên không phải là tổng hợp.

tôi về cơ bản tìm kiếm một ví dụ về implemetation REST của mô hình hạt thô Khóa Fowler: http://martinfowler.com/eaaCatalog/coarseGrainedLock.html

+0

Trong dịch vụ REST của bạn, bạn có thể thu thập các phiên bản và đưa chúng vào một Bản đồ được khóa bởi một id được tạo duy nhất đại diện cho phiên bản không? Sau đó gửi cho khách hàng và yêu cầu họ gửi lại cho bạn sau khi chỉnh sửa? Sau đó, bạn có thể sử dụng một id đó để lấy các phiên bản cho đồ thị của các thực thể. –

Trả lời

5

Đây là những gì ETag header được thiết kế cho. Một cách rất phổ biến để thực hiện nó là tạo ra tải trọng đáp ứng của bạn, tạo một giá trị băm (nó không phải là an toàn, chỉ xung đột thấp), và sau đó sử dụng giá trị băm đó làm giá trị của ETag. Lưu ý rằng cách tiếp cận này là không biết bao nhiêu nguồn tham gia vào việc tạo ra phản hồi.

Sau đó, khách hàng sẽ gửi lại ETag đã nhận được trong tiêu đề If-Match, mà máy chủ có thể sử dụng để kiểm tra độ mới của yêu cầu.

+0

Và nếu nó không đủ "mới", máy chủ HTTP sẽ gửi một mã trạng thái [409 (xung đột)] (http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.10). –

+0

412 thực sự. Xem http://tools.ietf.org/html/draft-ietf-httpbis-p4-conditional-21#section-3.1 – fumanchu

+0

Hmm, thú vị. Sau đó, ví dụ trong 409 khá rõ ràng: "Ví dụ, nếu phiên bản đang được sử dụng và thực thể là PUT bao gồm các thay đổi đối với tài nguyên xung đột với các yêu cầu được thực hiện bởi một yêu cầu trước đó (bên thứ ba), máy chủ có thể sử dụng phản hồi 409 để cho biết rằng nó không thể hoàn tất yêu cầu ". –

Các vấn đề liên quan