Trước hết, chuyển tiền là không có gì bạn không thể làm trong một cuộc gọi tài nguyên. Hành động bạn muốn làm là gửi tiền. Vì vậy, bạn thêm một tài nguyên chuyển tiền vào tài khoản của người gửi.
POST: accounts/alice, new Transfer {target:"BOB", abmount:100, currency:"CHF"}.
Làm xong. Bạn không cần phải biết rằng đây là một giao dịch phải là nguyên tử, v.v. Bạn chỉ cần chuyển tiền aka. gửi tiền từ A đến B.
Nhưng đối với những trường hợp hiếm hoi ở đây, một giải pháp chung:
Nếu bạn muốn làm một cái gì đó rất phức tạp liên quan đến nhiều tài nguyên trong một bối cảnh xác định với rất nhiều hạn chế thực sự vượt qua những gì so với lý do tại sao rào cản (kinh doanh so với kiến thức triển khai), bạn cần chuyển trạng thái. Vì REST sẽ không trạng thái khi bạn là khách hàng cần chuyển trạng thái xung quanh.
Nếu bạn chuyển trạng thái, bạn cần ẩn thông tin bên trong từ máy khách. Khách hàng không nên biết thông tin nội bộ chỉ cần thực hiện nhưng không mang thông tin liên quan về mặt kinh doanh. Nếu những thông tin đó không có giá trị kinh doanh, trạng thái sẽ được mã hóa và một phép ẩn dụ như mã thông báo, vượt qua hoặc một cái gì đó cần được sử dụng.
Bằng cách này, người ta có thể vượt qua trạng thái nội bộ xung quanh và sử dụng mã hóa và ký hệ thống vẫn có thể được bảo mật và âm thanh. Tìm kiếm sự trừu tượng phù hợp cho khách hàng tại sao anh ta chuyển qua thông tin trạng thái là một cái gì đó tùy thuộc vào thiết kế và kiến trúc.
Giải pháp thực sự:
Hãy nhớ REST đang nói HTTP và HTTP đi kèm với khái niệm sử dụng cookie. Những cookie này thường bị lãng quên khi mọi người nói về API REST, quy trình làm việc và tương tác trải rộng trên nhiều tài nguyên hoặc yêu cầu.
Hãy nhớ những gì được viết trong Wikipedia về cookie HTTP:
Cookies được thiết kế để trở thành một cơ chế đáng tin cậy để các trang web ghi nhớ thông tin trạng thái (như các mục trong giỏ hàng) hoặc để ghi lại hoạt động duyệt của người dùng (bao gồm nhấp vào các nút cụ thể, đăng nhập hoặc ghi lại những trang nào được người dùng truy cập từ xa trở lại như tháng hoặc năm trước).
Vì vậy, về cơ bản nếu bạn cần chuyển qua trạng thái, hãy sử dụng cookie. Nó được thiết kế cho chính xác cùng một lý do, đó là HTTP và do đó nó tương thích với REST theo thiết kế :).
Giải pháp tốt hơn:
Nếu bạn nói về một khách hàng thực hiện một quy trình công việc liên quan đến nhiều yêu cầu, bạn thường nói về giao thức. Mỗi hình thức giao thức đi kèm với một tập hợp các điều kiện tiên quyết cho từng bước tiềm năng như thực hiện bước A trước khi bạn có thể làm B.
Điều này là tự nhiên nhưng phơi bày giao thức cho khách hàng làm cho mọi thứ phức tạp hơn. Để tránh điều đó, chỉ cần nghĩ những gì chúng ta làm khi chúng ta phải thực hiện các tương tác và những thứ phức tạp trong thế giới thực .... Chúng tôi sử dụng một Đại lý.
Sử dụng phép ẩn dụ Tác nhân, bạn có thể cung cấp tài nguyên có thể thực hiện tất cả các bước cần thiết cho bạn và lưu trữ các bài tập / hướng dẫn thực tế mà nó đang thực hiện trong danh sách của nó (vì vậy chúng tôi có thể sử dụng POST trên đại lý hoặc 'đại lý').
Một ví dụ phức tạp:
Mua một căn nhà:
Bạn cần chứng minh uy tín của mình (như cung cấp các mục trong hồ sơ cảnh sát của bạn), bạn cần đảm bảo các chi tiết tài chính, bạn cần mua nhà thực tế bằng luật sư và bên thứ ba đáng tin cậy lưu trữ tiền, xác minh rằng ngôi nhà hiện thuộc về bạn và thêm các công cụ mua vào hồ sơ thuế của bạn, vv (như một ví dụ, một số bước có thể sai hoặc bất cứ điều gì).
Các bước này có thể mất vài ngày để hoàn thành, một số có thể được thực hiện song song, v.v.
Để làm điều này, bạn chỉ cần giao cho đại lý nhiệm vụ mua nhà như sau:
POST: agency.com/ { task: "buy house", target:"link:toHouse", credibilities:"IamMe"}.
Làm xong. Cơ quan gửi lại cho bạn một tài liệu tham khảo cho bạn mà bạn có thể sử dụng để xem và theo dõi trạng thái của công việc này và phần còn lại được thực hiện tự động bởi các đại lý của cơ quan.
Hãy suy nghĩ về một trình theo dõi lỗi chẳng hạn. Về cơ bản, bạn báo cáo lỗi và có thể sử dụng id lỗi để kiểm tra xem chuyện gì đang xảy ra. Bạn thậm chí có thể sử dụng một dịch vụ để lắng nghe những thay đổi của tài nguyên này. Nhiệm vụ đã hoàn thành.