Hiệu lực của Idem
Theo RFC, một PUT sẽ phải cung cấp toàn bộ đối tượng cho tài nguyên. Lý do chính của điều này, là PUT nên bình thường. Điều này có nghĩa là một yêu cầu, được lặp đi lặp lại sẽ đánh giá cùng một kết quả trên máy chủ.
Nếu bạn cho phép cập nhật một phần, nó không thể hoạt động mạnh nữa. Nếu bạn có hai khách hàng. Máy khách A và B, sau đó kịch bản sau đây có thể phát triển:
Khách hàng A có được một hình ảnh từ hình ảnh tài nguyên. Điều này có chứa một mô tả của hình ảnh, vẫn còn hiệu lực. Khách hàng B đặt một hình ảnh mới và cập nhật mô tả cho phù hợp. Bức tranh đã thay đổi. Khách hàng A thấy, anh ta không phải thay đổi mô tả, vì đó là như anh ta muốn và chỉ đặt hình ảnh.
Điều này sẽ dẫn đến sự không nhất quán, hình ảnh có siêu dữ liệu sai được đính kèm!
Khó chịu hơn nữa là bất kỳ trung gian nào cũng có thể lặp lại yêu cầu. Trong trường hợp nó quyết định bằng cách nào đó PUT thất bại.
Ý nghĩa của PUT không thể thay đổi (mặc dù bạn có thể sử dụng sai nó).
Sự lựa chọn khác
May mắn thay, có một lựa chọn khác, đây là VÒI. PATCH là một phương thức cho phép bạn cập nhật một phần cấu trúc. Bạn chỉ có thể gửi một cấu trúc một phần. Đối với các ứng dụng đơn giản, điều này là tốt. Phương pháp này không được đảm bảo là idem mạnh. Khách hàng nên gửi yêu cầu theo mẫu sau:
PATCH /file.txt HTTP/1.1
Host: www.example.com
Content-Type: application/example
If-Match: "e0023aa4e"
Content-Length: 20
{fielda: 1, fieldc: 2}
Và máy chủ có thể trả lời lại với 204 (Không có nội dung) để gắn cờ thành công. Khi có lỗi, bạn không thể cập nhật một phần của cấu trúc. Phương pháp PATCH là nguyên tử.
Nhược điểm của phương pháp này là, không phải tất cả các trình duyệt đều hỗ trợ điều này, nhưng đây là tùy chọn tự nhiên nhất trong dịch vụ REST.
Yêu cầu vá ví dụ:
http://tools.ietf.org/html/rfc5789#section-2.1
Json vá
Tùy chọn json dường như khá toàn diện và là một tùy chọn thú vị. Nhưng nó có thể khó thực hiện cho các bên thứ ba. Bạn phải quyết định xem cơ sở người dùng của bạn có thể xử lý việc này không.
Nó cũng hơi phức tạp, bởi vì bạn cần xây dựng một trình thông dịch nhỏ để chuyển đổi các lệnh thành một cấu trúc một phần, mà bạn sẽ sử dụng để cập nhật mô hình của mình. Trình thông dịch này cũng nên kiểm tra, nếu các lệnh được cung cấp có ý nghĩa. Một số lệnh triệt tiêu lẫn nhau. (viết fielda, xóa fielda). Tôi nghĩ rằng bạn muốn báo cáo lại điều này cho khách hàng để hạn chế thời gian gỡ lỗi về phía anh ấy / cô ấy.
Nhưng nếu bạn có thời gian, đây là một giải pháp thực sự thanh lịch. Bạn vẫn nên xác nhận các lĩnh vực của khóa học. Bạn có thể kết hợp điều này với phương thức PATCH để ở trong mô hình REST. Nhưng tôi nghĩ POST sẽ được chấp nhận ở đây.
Xu hướng tồi đi
Nếu bạn quyết định chọn tùy chọn PUT, điều này có phần rủi ro. Sau đó, bạn ít nhất không nên loại bỏ lỗi. Người dùng có một kỳ vọng nhất định (dữ liệu sẽ được cập nhật) và nếu bạn phá vỡ điều này, bạn sẽ cung cấp cho một số nhà phát triển không phải là thời điểm tốt.
Bạn có thể chọn gắn cờ trở lại: 409 Xung đột hoặc 403 Bị cấm. Nó phụ thuộc vào cách bạn nhìn vào quá trình cập nhật. Nếu bạn thấy nó là một bộ quy tắc (hệ thống trung tâm), thì xung đột sẽ tốt hơn. Một cái gì đó như, các lĩnh vực này không thể cập nhật. (Xung đột với các quy tắc). Nếu bạn thấy đó là một vấn đề ủy quyền (lấy người dùng làm trung tâm), thì bạn nên quay lại bị cấm. Với: bạn không được phép thay đổi các trường này.
Bạn vẫn nên buộc người dùng gửi tất cả các trường có thể sửa đổi.
Một tùy chọn hợp lý để thực thi điều này là đặt nó thành tài nguyên phụ, chỉ cung cấp dữ liệu có thể sửa đổi.
Ý kiến cá nhân
Cá nhân tôi sẽ đi (nếu bạn không phải làm việc với các trình duyệt) cho mô hình PATCH đơn giản và sau đó mở rộng nó bằng bộ xử lý vá JSON. Điều này có thể được thực hiện bằng cách phân biệt các mimetypes: Loại mime của bản vá json:
ứng dụng / json-patch
Và json: ứng dụng / json-patch
làm cho nó dễ dàng để thực hiện nó trong hai giai đoạn.