Tôi đang thiết kế một API RESTful cho một ứng dụng di động mà tôi đang làm việc. Vấn đề của tôi là với các bộ sưu tập lớn chứa nhiều mục. Tôi hiểu rằng thực hành tốt là phân trang số lượng lớn các kết quả trong một bộ sưu tập.Vấn đề về số trang trong thiết kế RESTful API
Tôi đã đọc tài liệu API biểu đồ Facebook (https://developers.facebook.com/docs/graph-api/using-graph-api/v2.2), tài liệu con trỏ Twitter (https://dev.twitter.com/overview/api/cursoring), GitHub API doc (https://developer.github.com/v3/) và bài đăng này (API pagination best practices).
Hãy xem xét một bộ sưu tập mẫu /resources
trong API của tôi có chứa 100 mục có tên resource1
đến resource100
và được sắp xếp giảm dần. Đây là câu trả lời bạn sẽ nhận được khi một yêu cầu GET (GET http://api.path.com/resources?limit=5
):
{
"_links": {
"self": { "href": "/resources?limit=5&page=1" },
"last": { "href": "/resources?limit=5&page=7" },
"next": { "href": "/resources?limit=5&page=2" }
},
"_embedded": {
"records": [
{ resource 100 },
{ resource 99 },
{ resource 98 },
{ resource 97 },
{ resource 96 }
]
}
}
Bây giờ vấn đề của tôi là một kịch bản như thế này:
1- Tôi GET /resources
với nội dung trên.
2- Sau đó, nội dung nào đó được thêm vào bộ sưu tập tài nguyên (giả sử một thiết bị khác thêm tài nguyên mới cho tài khoản này). Bây giờ tôi có 101 tài nguyên.
3- Tôi nhận được /resources?limit=5&page=2
vì phản hồi ban đầu cho thấy sẽ chứa trang tiếp theo trong kết quả của tôi. Câu trả lời sẽ là như thế này:
{
"_links": {
"self": { "href": "/history?page=2&limit=5" },
"last": { "href": "/history?page=7&limit=5" },
"next": { "href": "/history?page=3&limit=5" }
},
"_embedded": {
"records": [
{ resource 96 },
{ resource 95 },
{ resource 94 },
{ resource 93 },
{ resource 92 }
]
}
}
Như bạn thấy resource 96
được lặp lại trong cả hai trang (Hoặc vấn đề tương tự có thể xảy ra nếu một nguồn lực bị xóa trong bước 2, trong trường hợp đó một tài nguyên sẽ bị mất).
Vì tôi muốn sử dụng ứng dụng này trong ứng dụng dành cho thiết bị di động và trong một danh sách, tôi phải thêm tài nguyên của từng cuộc gọi API vào một cuộc gọi trước đó để tôi có thể có danh sách đầy đủ. Nhưng điều này thật rắc rối. Vui lòng cho tôi biết nếu bạn có đề xuất. Cảm ơn bạn trước.
P.S: Tôi đã coi dấu thời gian như chuỗi truy vấn thay vì phân trang dựa trên con trỏ, nhưng điều đó sẽ gây ra vấn đề ở một nơi khác cho tôi. (cho tôi biết nếu bạn cần thêm thông tin về điều đó.)
Tại sao không sử dụng cả phân trang dựa trên con trỏ và dấu thời gian? –