2009-06-23 25 views
6

Tôi đang phát triển một api REST, và tôi tự hỏi như sau:sử dụng HTTP PUT, nhưng không thay thế hoàn toàn các thực thể

Tôi muốn sử dụng HTTP PUT để cập nhật một số đối tượng trong webservice. Định dạng sẽ là một phần nội dung được mã hóa. Có thể chấp nhận chỉ cập nhật các trường đã được chỉ định thực sự chứ không phải toàn bộ thực thể không? Tôi yêu cầu, bởi vì PUT sẽ là một phương pháp rất thuận tiện để thực hiện một số cập nhật, nhưng tôi không muốn chúng loại bỏ các trường nếu chúng vừa mới xảy ra lỗi chính tả một số trường. Ngoài ra, tôi không muốn ép buộc người triển khai luôn phải thực hiện GET trước và sao chép mọi trường đơn lẻ mà họ có thể không thực sự sử dụng ..

Trả lời

2

Đặt chỉ để thay thế hoàn toàn. Có đề xuất cho động từ PATCH để giải quyết vấn đề bạn có (http://www.ietf.org/internet-drafts/draft-dusseault-http-patch-14.txt)

Bản vá, tuy nhiên, vẫn không thể là thứ bạn muốn. Những gì được gửi là một tài nguyên cập nhật có thể làm những việc như các bộ đếm gia tăng và do đó, không giống như đặt, không phải là idempotent.

Bạn có thể phơi bày từng trường dưới dạng tài nguyên và thực hiện nhiều lần đặt cho từng trường. Bạn có thể pipeline đặt để giảm thiểu độ trễ thêm.

+0

PATCH, giống như bạn đã đề cập, vẫn là bản nháp .. Nhiều PUT sẽ gây phiền toái :) Tôi có thể sử dụng POST cho tất cả thay vào đó .. PUT sẽ đẹp hơn nhiều .. – Evert

+0

Đồng ý rằng POST có thể là lựa chọn tốt nhất của bạn - nhưng hãy xem xét đặt pipelined nếu số trường được cập nhật là nhỏ so với tổng số trường. –

1

Tôi có thể nói là có thể hợp lý. Tôi cho rằng ý tưởng REST rất linh hoạt, vì vậy nếu bạn Cập nhật một thực thể thì tại sao không chỉ chuyển các trường cần được cập nhật trong triển khai của bạn. Đó là sự thật, rằng nó cần nhiều nỗ lực mặt máy chủ mặc dù. Bạn phải kiểm tra xem thực thể có sẵn và có thể được cập nhật với dữ liệu được truyền và bạn cần kiểm tra xác nhận (trái ngược với dữ liệu tài liệu hướng lược đồ miễn phí).

<!-- PUT books/1337 --> 

<book> 
    <title>Hello</title> 
    <author>John Doe</author> 
</book> 

<!-- PUT books/1337 --> 

<book> 
    <title>Hello here I am</title> 
</book> 
+0

Ý tưởng REST có thể linh hoạt, nhưng nó nói rằng các động từ bạn sử dụng phải có hành vi thống nhất. HTTP khá cụ thể về cách xử lý PUT.Sự đồng thuận là PUT nên thay thế các thực thể và không làm những gì bạn đang đề xuất. –

+0

Yepp Tôi đồng ý rằng POST là lựa chọn tốt nhất sau đó. Linh hoạt như nó đặt người ta không nên phá vỡ những ý tưởng/quy tắc cơ bản. – Daff

4

Bạn chỉ cần POST các thuộc tính được cập nhật vào tài nguyên. Nhớ POST là động từ bắt tất cả mà bạn có thể sử dụng để làm bất cứ điều gì bạn cần làm khi các động từ khác không hoạt động cho bạn.

Kiểm tra bài viết của Roy It's ok to use POST

1

Tôi chưa bao giờ thích bất kỳ trong những giải pháp để cập nhật một phần, một trong hai. Nếu tôi đang thiết kế một dịch vụ web để sử dụng rộng rãi, tôi có thể đi với POST. Nếu nó được sử dụng bởi một số lượng khá nhỏ người, tức là, tôi có thể nói chuyện với tất cả những người tôi mong đợi để gọi nó, tôi đã có hai ý tưởng khác nhau để giải quyết nó.

  1. PUT thành tài nguyên 'cập nhật' mới. Về cơ bản nó sẽ ghi lại bản cập nhật bạn muốn áp dụng và sau đó chịu trách nhiệm không áp dụng các bản sao. Tôi hình dung điều này làm việc giống như một hệ thống kiểm soát phiên bản mà giữ một danh sách các bản vá lỗi/changesets và được khá phức tạp mỗi khi tôi cố gắng nghĩ ra tất cả các trường hợp góc.

  2. PUT vào tài nguyên, nhưng không thay đổi bất kỳ trường nào không có mặt. Yêu cầu các trường mà bạn muốn NULL xuất hiện với thuộc tính đặc biệt cho biết bạn muốn NULL nó ra. Điều này có vẻ thực tế hơn nhiều, nhưng không phù hợp với sự đồng thuận rằng PUT phải là bản cập nhật hoàn chỉnh.

Nếu có ai trỏ đến các cuộc thảo luận về ý tưởng tương tự, vui lòng chỉnh sửa/nhận xét tương ứng.

+0

Tôi có cùng tình cảm .. Mặc dù nó có thể không chính xác những gì PUT được dự định; Tôi sẽ làm sau xử lý anyway theo yêu cầu (nó sẽ đi vào DB và nó sẽ có đại diện khác nhau/định dạng khi mọi người yêu cầu nó). Tôi chỉ cảm thấy đây là cách mọi người mong đợi nó hoạt động. Tôi cũng muốn giữ POST để chỉ tạo các phần tử con (ví dụ: chèn) vì vậy tôi cảm thấy cuối cùng nó là đơn giản nhất – Evert

+0

@Hank - Lý do để sử dụng PUT nếu bạn định vi phạm ngữ nghĩa của nó là gì? Nếu tôi PUT một cái gì đó, GET nên trả lại nó. Tại sao không sử dụng POST bất kể ai đang dùng nó? –

+0

@Tony Đối với một điều, PUT sẽ vẫn là idempotent và POST vẫn không. Ngoài ra, quá trình suy nghĩ tự nhiên của tôi là * không * để xóa những thứ không có; với tôi đó là KHÔNG CHĂM SÓC, không phải DELETE; DELETE/NULL phải rõ ràng, không ngầm. Nếu chi phí truyền thông nhỏ, tức là, ít người tham gia, tôi muốn chúng tôi đồng ý với những gì phù hợp với quá trình suy nghĩ tự nhiên của tôi hơn là làm việc xung quanh những gì tôi xem xét một lỗ hổng thiết kế. Chi phí truyền thông là lý do tại sao tôi sẽ không làm điều đó cho một đối tượng rộng; tại thời điểm đó, chi phí phụ trội sẽ lớn hơn những lợi ích của việc giảm ma sát tâm thần của tôi. –

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