2014-06-18 20 views
5

Giả sử tôi đang tạo giao diện RESTful và tôi muốn tải lên tài nguyên bằng cách sử dụng PUT đến /resources/{id}. Nhưng tôi chỉ muốn tải lên thứ nếu nó chưa được tải lên trước đây.RESTful PUT nếu không tồn tại?

Tôi nhận thấy rằng PUT phải là idempotent, vì vậy nếu tôi PUT một cái gì đó hai lần vào cùng một URL, nó sẽ thành công cả hai lần, phải không?

Tôi cũng hiểu rằng tôi có thể sử dụng HEAD trên tài nguyên hiện có và sau đó use an ETag vào trong số PUT để đảm bảo rằng tài nguyên chưa được sửa đổi kể từ lần cuối tôi kiểm tra.

Nhưng làm cách nào tôi có thể đảm bảo rằng tôi chỉ tải lên một thứ nếu thứ đó chưa tồn tại? Đó là, làm thế nào tôi có thể chắc chắn rằng tôi không bước vào điều của người khác?

Trả lời

4

Tôi nhận ra rằng PUT phải là idempotent, vì vậy nếu tôi PUT một cái gì đó hai lần đến cùng một URL nó sẽ thành công cả hai lần phải không?

Đúng.

Nhưng làm cách nào tôi có thể đảm bảo rằng tôi chỉ tải lên một thứ nếu thứ không đã tồn tại? Đó là, làm thế nào tôi có thể chắc chắn rằng tôi không bước vào một người nào đó điều khác?

Không sử dụng cuộc gọi HEAD. Thực hiện cuộc gọi PUT bằng cách sử dụng tiêu đề If-None-Match: *. Điều này sẽ chỉ thị cho máy chủ để chỉ thực hiện các hoạt động nếu không có thực thể hiện tại tồn tại, như chi tiết trong RFC 2616 đoạn 3.

3

Xem http://greenbytes.de/tech/webdav/rfc7232.html#rfc.section.3.2.p.7:

"Nếu-Không-Khớp cũng có thể được sử dụng với một giá trị của" * "để ngăn chặn một phương thức yêu cầu không an toàn (ví dụ, PUT) từ vô tình sửa đổi một biểu diễn hiện tại của tài nguyên đích khi máy khách tin rằng tài nguyên không có biểu diễn hiện tại (Phần 4.2.1 của [RFC7231]). về vấn đề "cập nhật bị mất" có thể phát sinh nếu có nhiều hơn một khách hàng cố gắng tạo một đại diện ban đầu cho tài nguyên đích. "

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