2011-07-21 51 views
5

Trong REST - revertable DELETE phần giới thiệu tốt về các thay đổi trạng thái mô hình howto trong REST đã được đưa ra. Về cơ bản, nếu bạn có tài nguyên có trạng thái trường, bạn chỉ cần đặt phiên bản mới của tài nguyên đó với trường cập nhật trạng thái.REST - chuyển tiếp trạng thái mô hình

Trong chủ đề này, tôi muốn mở rộng mô hình này. Giả sử bạn có một tài nguyên có thể ở hai trạng thái: 1 và 2. Ngược lại với mô hình đơn giản như được mô tả trong bài trích dẫn, có ba chuyển đổi để chuyển từ trạng thái 1 sang trạng thái 2, thay vì chỉ một.

Câu hỏi của tôi là: bạn sẽ mô hình chuyển tiếp trạng thái trong REST như thế nào?

Bản thân tôi không thể đưa ra một POST RPC-như, đó không phải là rất RESTian lẽ:

POST http://server/api/x 
    target_state=2&transition=3 

này thay đổi tài nguyên x từ trạng thái 1 đến trạng thái 2 bằng cách sử dụng chuyển tiếp 3.

Trả lời

2

Điều này không thực sự giới hạn đối với REST; nó là một câu hỏi cơ bản hơn về máy nhà nước. Máy trạng thái nên đóng gói toàn bộ trạng thái, để nếu bạn thấy mình tạo nhiều chuyển tiếp từ trạng thái này sang trạng thái khác, và sự khác biệt là quan trọng, thì sự khác biệt đó cũng phải được ghi lại trong trạng thái.

Ví dụ: giả sử tôi không có nhà riêng. Tôi có thể chuyển từ trạng thái "vô gia cư" sang trạng thái "nhà" theo ba cách: Tôi có thể thuê một, tôi có thể mua một cái, tôi có thể lấy cắp một cái. Ba chuyển tiếp từ "vô gia cư" sang "nhà"? Không phải trong thế giới máy móc. Hoặc sự khác biệt là quan trọng, hoặc họ không. Nếu không, thì với máy không có điểm nào trong việc tạo ra sự khác biệt chút nào. Chỉ PUT trạng thái mới của "home". Nếu có, thì chúng ta cần phải mở rộng khái niệm về trạng thái của chúng ta để bao gồm sự khác biệt. Ví dụ:

  homeless 
     A A A 
    / | \ 
     V  |  V 
possessor <--|--- renter 
     A  | /
     \ | /
     V V V 
      owner 

Tôi có thể chuyển từ người vô gia cư sang người sở hữu bằng cách ăn cắp nhà. Nếu tôi ngồi xổm trên nó đủ lâu, tôi có thể trở thành chủ nhân. Hoặc tôi có thể vô gia cư và thuê nhà, hoặc thậm chí là thuê nhà riêng. Hoặc tôi có thể mua một cái. Tất cả ba đường dẫn đưa tôi đến trạng thái "chủ sở hữu", nhưng chúng sử dụng các trạng thái trung gian để biểu thị các chuyển tiếp khác nhau đáng kể.

Nếu sau đó bạn muốn đại diện cho "vô gia cư" so với "trong nhà" (người sở hữu | người thuê nhà | chủ sở hữu), không có vấn đề nào phơi bày điều đó dưới dạng tài nguyên chỉ đọc, được tính toán. Chỉ cần không để bất cứ ai PUT/POST với nó, vì quá trình chuyển đổi không rõ ràng. Cũng không có vấn đề gì trong việc giữ lịch sử chuyển tiếp trạng thái như một tập hợp các nguồn tài nguyên bổ sung, nếu trạng thái đó là quan trọng.

+0

Đầu tiên, cảm ơn rất nhiều câu trả lời chi tiết của bạn. Rất tuyệt. Nhưng tôi vẫn không thực sự tin rằng mỗi quá trình chuyển đổi có thể dễ dàng được mô hình hóa như một trạng thái. Tôi nghĩ rằng có một sự khác biệt rất lớn giữa các trạng thái trung gian và trạng thái vĩnh viễn. Bạn đã bao gồm nhóm thứ hai. Về nhóm đầu tiên, một ví dụ: giả sử bạn có thể đi từ người vô gia cư đến người giả lập theo 3 cách: bạn trả tiền cho nó, bạn kế thừa hoặc bạn thắng nó trong một lô đất. Bạn cũng sẽ mô hình này như là các trạng thái riêng biệt? Điều này không dẫn đến sự bùng nổ của các quốc gia 'chỉ vì mục đích đại diện cho các quá trình chuyển đổi khác nhau như các quốc gia'? Làm thế nào để bạn thấy điều đó? –

+0

[Bởi "sở hữu" tôi có nghĩa là "bị đánh cắp". Nếu bạn trả tiền cho nó hoặc giành chiến thắng trong xổ số, bạn đang ở trạng thái "chủ sở hữu".] Nếu ứng dụng của bạn quan trọng với đường dẫn, thì có, bạn nên sử dụng trạng thái trung gian, tạo trạng thái thiết bị đầu cuối mới hoặc thêm trạng thái bổ sung (như tài nguyên cho thế chấp) để thể hiện sự khác biệt. – fumanchu

+0

Được rồi, có ý nghĩa. Tôi chỉ sợ một vụ nổ của các trạng thái 'ảo', được tạo ra bởi sản phẩm chéo của tất cả các chuyển tiếp có thể xảy ra. –

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