Có thực sự không có cách thực sự RESTful nào khác để có được dữ liệu bạn cần trong 1 hoặc 2 yêu cầu không?
- Không thực sự
- Nhưng đừng nghĩ quá nhiều
Như thường lệ, khi nghĩ về REST, hãy nhớ rằng có một triển khai tham chiếu (web trên toàn thế giới) mà bạn có thể kiểm tra.
Hãy xem xét cổng thông tin Amazon - khi tôi mở dấu trang đó với bộ đệm trống, tôi thấy trình duyệt của mình thực hiện yêu cầu tới 275 tài nguyên.
Tôi có nhận được độ trễ tốt hơn nếu tất cả trạng thái đó được tải trong một tải trọng không? Đúng.
Nó sẽ mở rộng quy mô? nó sẽ quy mô web? Chắc là không. Đó là 4,5 MB dữ liệu không thể chia sẻ vì bao gồm 1KB dành riêng cho hồ sơ của tôi. Nếu đồng nghiệp của tôi ở bàn làm việc bên cạnh tôi cũng đến Amazon, cô ấy sẽ lấy cùng một dữ liệu trên mạng.
Phân tách tải trọng đó thành các tài nguyên có thể định địa chỉ riêng lẻ và đột nhiên mọi thứ trở nên tốt hơn rất nhiều - mỗi chúng tôi vẫn nhận được 1KB cá nhân hóa và mỗi chúng tôi vẫn có bản sao lưu trữ cục bộ 4,5 MB, nhưng chúng tôi không cần phải đập mạng cũng khó, bởi vì hầu hết các yêu cầu của chúng tôi được phục vụ bởi bộ đệm chia sẻ cục bộ, thay vì cần định tuyến qua internet.
Ngoài ra, hãy nhớ rằng bạn không thực sự có vấn đề với nhiều tài nguyên , bạn có vấn đề với nhiều yêu cầu . Điều đó có thể được giảm thiểu bằng cách sử dụng Lời hứa đẩy HTTP / 2.0 , với máy chủ chủ động đẩy các biểu diễn có thể được lưu vào bộ đệm. Có thể - một máy chủ không trạng thái không biết máy khách đã lưu vào bộ đệm gì và TLS gợi ý rằng bộ nhớ đệm tại các trung gian không phải là ưu tiên ....
Điều này có nghĩa là nếu bạn cần, giả sử, truy vấn danh sách 100 người dùng đã đăng nhập gần đây nhất và hiển thị tên và email của họ, trước tiên bạn cần thực hiện truy vấn GET cho danh sách kết quả, về cơ bản (về cơ bản ) là danh sách các thành phần liên kết, với mỗi đối tượng liên kết chứa URI của tài nguyên người dùng. Sau đó, bạn sẽ cần thực hiện thêm 100 yêu cầu GET - một yêu cầu cho mỗi tài nguyên người dùng - trước khi bạn thực sự có dữ liệu bạn cần để hiển thị kết quả của mình.
Tất nhiên, nếu bạn đang làm điều này trong html, đại diện của người dùng đăng nhập gần đây nhất có thể là một tài liệu với danh sách hoặc bảng tên và địa chỉ email và liên kết đến các tài nguyên đó. Ta-da.
Đừng để mất dấu vết của quan sát này bằng cách Fielding.
Điều đó không có nghĩa là tôi nghĩ mọi người nên thiết kế hệ thống của riêng mình theo phong cách kiến trúc REST. REST dành cho các ứng dụng dựa trên mạng tồn tại lâu dài trải rộng trên nhiều tổ chức. Nếu bạn không thấy sự cần thiết cho các ràng buộc, thì đừng sử dụng chúng.
BIÊN TẬP
Tôi có thể đưa ra lập luận tương tự cho biểu diễn JSON không? tức là, nếu tài nguyên được đề cập là "100 người dùng đã đăng nhập lần cuối" thay vì kết quả của truy vấn được tham số hóa, thì tôi có thể trả lại dữ liệu thay vì liên kết tài nguyên không? nếu không thì tại sao? Tại sao JSON về cơ bản khác với HTML về vấn đề này?
Chúng giống nhau như thế nào: đóng gói thêm dữ liệu vào "danh sách kết quả" giúp bạn tiết kiệm chi phí cho các yêu cầu bổ sung, đồng thời ảnh hưởng đến tỷ lệ. Loại phương tiện cụ thể bạn đang sử dụng cho đại diện không thành vấn đề - ít nhất, theo như tôi biết.
Chúng khác nhau như thế nào: HTML là định dạng hypermedia và JSON không - bất kỳ triển khai máy khách tiêu chuẩn không quen thuộc nào với thông số HTML sẽ biết cách tìm các liên kết trong tài liệu HTML, hỗ trợ các tùy chọn như tìm nạp trước. JSON không có tiêu chuẩn hóa đó - bạn cần thông tin ngoài luồng về cấu trúc dữ liệu để hiểu vị trí của các liên kết trong một biểu diễn JSON. HAL sẽ phù hợp hơn với HTML về vấn đề này; sự khác biệt chính giữa HAL và HTML là việc áp dụng; HTML có khởi đầu 20 năm?
Để biết thêm thông tin chi tiết, bạn cũng có thể xem xét xem lại Định dạng cung cấp nguyên tử , mô tả cả Mục nhập và Nguồn cấp dữ liệu (danh sách các mục nhập), đặc biệt là các quy tắc cho nguyên tử: mục nhập , có thể được truy cập thông qua tài nguyên độc lập hoặc thông qua tài nguyên nguồn cấp dữ liệu.