2010-02-22 41 views
12

Tôi biết REST có nghĩa là định hướng tài nguyên, điều này gần như chuyển thành các hoạt động CRUD trên các tài nguyên này bằng cách sử dụng các phương thức HTTP chuẩn. Nhưng những gì tôi chỉ muốn cập nhật một phần của tài nguyên?Dịch vụ và hoạt động cập nhật RESTful

Ví dụ: giả sử tôi có tài nguyên Payment và tôi muốn đánh dấu trạng thái của tài khoản là "paid". Tôi không muốn POST toàn bộ đối tượng Payment thông qua HTTP (đôi khi tôi thậm chí không có tất cả dữ liệu).

Cách nào để RESTful thực hiện điều này? I have seen that Twitter sử dụng các phương pháp sau đây cho updating Twitter statuses:

http://api.twitter.com/1/statuses/update.xml?status=playing with cURL and the Twitter API 

là phương pháp này trong "tinh thần" của REST?

CẬP NHẬT: PUT -> POST

Một số liên kết tôi tìm thấy trong khi chờ đợi:

+0

Bài viết "PUT không phải là CẬP NHẬT" mà bạn đã liên kết có một đoạn SQL đáng kể với nó. Đọc các nhận xét trước khi thay đổi điểm cuối của bạn. – gmoore

Trả lời

9

Cách lý tưởng để thực hiện việc này là thay đổi một phần (tài nguyên phụ) của tài nguyên và yêu cầu máy chủ trả lại 303 Xem khác với tiêu đề Vị trí để trỏ đến tài nguyên bị thay đổi. Các 303 Xem khác nói với khách hàng rằng kết quả của yêu cầu một số tài nguyên khác đã thay đổi và khách hàng nên cập nhật biểu diễn mà nó nắm giữ.

Trong ví dụ của bạn (loại phương tiện giả, tất nhiên):

 
1. Client retrieves payment representation 
GET /payments/2 

200 Ok 
Content-Type: application/payment+xml 

<payment> 
    <status href="/payments/2/status" value="pending"/> 
</payment> 

2. Client updates status 
PUT /payments/2/status 
Content-Type: text/plain 

payed 

303 See Other 
Location: /payments/2 

3. Client follows the 303 redirect 
GET /payments/2 

200 Ok 
Content-Type: application/payment+xml 

<payment> 
    <status href="/payments/2/status" value="payed"/> 
</payment> 

+0

@Jan, vâng, bây giờ tôi đã tìm hiểu thêm về các bài viết REST PUT/POST, tôi nghĩ rằng tôi hiểu khái niệm này. –

-1

Tôi đoán, đó là những gì POST tôi s cho: 'U' trong 'CRUD'.

Bạn POST dữ liệu vào tài nguyên hiện có. Tài nguyên quyết định phải làm gì với nó và được cập nhật. Ngoài ra, dữ liệu POST có thể chỉ là một đoạn của tài nguyên hoàn chỉnh.

Cách tiếp cận của Twitter là IMHO không RESTful, vì chúng quá tải GET.

+0

Boldewyn, tôi nghĩ PUT là để cập nhật. Có vẻ như có sự nhầm lẫn về điều này: Wikipedia nói một điều (http: //en.wikipedia.org/wiki/Representational_State_Transfer # RESTful_web_services), và có những tiếng nói khác (http://16cards.com/2007/03/10/the-cafes-put-is-not-update/). Các mảnh vỡ: điều này có nghĩa là XSD không được thực thi bất kỳ nội dung bắt buộc nào (ngoại trừ khóa chính)? –

+3

PUT và POST có nghĩa là chính xác những gì được viết trong thông số HTTP. Không nhiều không ít. PUT có nghĩa là cập nhật theo nghĩa 'thay thế trạng thái hiện tại của tài nguyên với trạng thái này' và POST chỉ có nghĩa là 'xử lý điều này (theo bản chất của bạn)'. Bạn * có thể * thực hiện cập nhật một phần bằng POST trên tài nguyên phụ (ví dụ: POST/payments/2/post-here) nhưng bạn cần xác định tất cả các loại tải trọng. Phương pháp PUT với 303 là đơn giản hơn. –

+1

API của Twitter không phải là RESTful vì nó không sử dụng ngữ nghĩa loại phương tiện truyền thông nhưng cung cấp mô tả tĩnh về các tài nguyên và hoạt động sẵn có. Đó không phải là REST (không có nghĩa là nó không hữu ích). Bản cập nhật dường như yêu cầu POST, vì vậy ít nhất tôi không thấy twitter sử dụng phương thức miễn phí (GET) cho các hoạt động thay đổi. –

3

POST nên được sử dụng cho việc thay đổi một nguồn tài nguyên

EDIT: Bài viết của Martin Fowler Richardson Maturity Model là một giới thiệu rất tốt để nghỉ ngơi.

+0

@Dominik, thực sự nó phức tạp hơn một chút. Xem các liên kết tôi đã thêm vào câu hỏi. –

0

Có gì sai với PATCH? Vấn đề "sửa đổi một phần" dường như kêu gọi nó, đặc biệt là xem xét rằng đôi khi bạn không có tất cả các dữ liệu cần thiết để "thay thế" ... Nhưng thành thật mà nói, tôi không thấy điểm nào sau "POST = create, PUT = thay thế, PATCH = cập nhật "triết lý tôn giáo, và tôi thấy không có gì sai khi chỉ sử dụng POST.

+0

PATCH có một cú pháp đặc biệt liên kết với nó. Xem [chuẩn JSON PATCH IETF đang chờ xử lý] (http://tools.ietf.org/html/rfc6902) để biết thêm thông tin. –

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