Hãy nhớ rằng với API REST, tất cả chỉ là câu hỏi về quan điểm của bạn.
Hai khái niệm chính trong API REST là điểm cuối và tài nguyên (thực thể). Đặt một cách lỏng lẻo, một điểm cuối hoặc trả về tài nguyên thông qua GET hoặc chấp nhận tài nguyên thông qua POST và PUT, v.v. (hoặc kết hợp các yếu tố trên).
Chúng tôi chấp nhận rằng với POST, dữ liệu bạn gửi có thể hoặc không dẫn đến việc tạo ra một tài nguyên mới và (các) điểm cuối liên quan của nó, rất có thể sẽ không "sống" dưới url POSTed. Nói cách khác, khi bạn POST bạn gửi dữ liệu ở đâu đó để xử lý. Điểm cuối POST không phải là nơi thường tìm thấy tài nguyên.
Trích dẫn từ RFC 2616 (với các phần không liên quan được bỏ qua và các phần có liên quan được tô sáng):
9,5 BÀI ĐĂNG
Phương thức POST được sử dụng để yêu cầu máy chủ gốc chấp nhận thực thể được đính kèm trong yêu cầu dưới dạng cấp dưới mới của tài nguyên được xác định bởi URI yêu cầu trong Dòng yêu cầu. POST được thiết kế để cho phép một phương thức thống nhất bao gồm các chức năng sau:
- ...
- Cung cấp một khối dữ liệu, chẳng hạn như kết quả của việc gửi biểu mẫu, cho quy trình xử lý dữ liệu;
- ...
...
Hành động được thực hiện bởi phương thức POST có thể không dẫn đến một tài nguyên có thể được xác định bởi một URI . Trong trường hợp này, 200 (OK) hoặc 204 (Không có nội dung) là trạng thái phản hồi phù hợp, tùy thuộc vào việc phản hồi có bao gồm thực thể mô tả kết quả hay không .
Nếu tài nguyên đã được tạo trên máy chủ gốc, phản hồi NÊN là 201 (Đã tạo) ...
Chúng tôi đã quen với các điểm cuối và tài nguyên đại diện cho 'mọi thứ' hoặc 'dữ liệu', có thể là người dùng, tin nhắn, sách - bất cứ điều gì mà miền vấn đề ra lệnh. Tuy nhiên, điểm cuối cũng có thể hiển thị một tài nguyên khác - ví dụ: kết quả tìm kiếm.
Hãy xem xét ví dụ sau:
GET /books?author=AUTHOR
POST /books
PUT /books/ID
DELETE /books/ID
Đây là một CRUD REST điển hình. Tuy nhiên, nếu chúng ta thêm vào:
POST /books/search
{
"keywords": "...",
"yearRange": {"from": 1945, "to": 2003},
"genre": "..."
}
Không có gì không RESTful về điểm cuối này. Nó chấp nhận dữ liệu (thực thể) dưới dạng cơ thể yêu cầu. Dữ liệu đó là Tiêu chí tìm kiếm - một DTO như mọi thứ khác. Điểm cuối này tạo ra một tài nguyên (thực thể) để đáp ứng yêu cầu: Kết quả tìm kiếm . Tài nguyên kết quả tìm kiếm là tạm thời, được phục vụ ngay lập tức cho khách hàng, không chuyển hướng và không bị lộ ra khỏi một số url chính tắc khác.
Đó vẫn là REST, ngoại trừ các thực thể không có sách - thực thể yêu cầu là tiêu chí tìm kiếm sách và thực thể phản hồi là kết quả tìm kiếm sách.