API ReSTful được tiêu thụ chủ yếu bởi các hệ thống khác, đó là lý do tại sao tôi đặt dữ liệu phân trang trong tiêu đề phản hồi. Tuy nhiên, một số người tiêu dùng API có thể không có quyền truy cập trực tiếp vào tiêu đề phản hồi hoặc có thể đang xây dựng UX trên API của bạn, do đó cung cấp cách truy xuất (theo yêu cầu) siêu dữ liệu trong phản hồi JSON là dấu cộng.
Tôi tin rằng việc triển khai của bạn nên bao gồm siêu dữ liệu có thể đọc được máy làm mặc định và siêu dữ liệu có thể đọc được khi được yêu cầu. Siêu dữ liệu có thể đọc được của con người có thể được trả về với mọi yêu cầu nếu bạn thích hoặc, tốt nhất là theo yêu cầu thông qua tham số truy vấn, chẳng hạn như include=metadata
hoặc include_metadata=true
.
Trong trường hợp cụ thể của bạn, tôi sẽ bao gồm URI cho từng sản phẩm có bản ghi. Điều này giúp người tiêu dùng API dễ dàng tạo liên kết đến từng sản phẩm. Tôi cũng sẽ đặt ra một số kỳ vọng hợp lý theo giới hạn của yêu cầu phân trang của tôi.Việc triển khai và ghi lại các cài đặt mặc định cho kích thước trang là một thực tế có thể chấp nhận được. Ví dụ: GitHub's API đặt kích thước trang mặc định thành 30 bản ghi với tối đa 100, cộng với đặt giới hạn tốc độ về số lần bạn có thể truy vấn API. Nếu API của bạn có kích thước trang mặc định thì chuỗi truy vấn có thể chỉ định chỉ mục trang.
Trong kịch bản của con người có thể đọc được, khi điều hướng đến /products?page=5&per_page=20&include=metadata
, phản ứng có thể là:
{
"_metadata":
{
"page": 5,
"per_page": 20,
"page_count": 20,
"total_count": 521,
"Links": [
{"self": "/products?page=5&per_page=20"},
{"first": "/products?page=0&per_page=20"},
{"previous": "/products?page=4&per_page=20"},
{"next": "/products?page=6&per_page=20"},
{"last": "/products?page=26&per_page=20"},
]
},
"records": [
{
"id": 1,
"name": "Widget #1",
"uri": "/products/1"
},
{
"id": 2,
"name": "Widget #2",
"uri": "/products/2"
},
{
"id": 3,
"name": "Widget #3",
"uri": "/products/3"
}
]
}
Đối với siêu dữ liệu máy có thể đọc, tôi sẽ thêm Link headers để phản ứng:
Link: </products?page=5&perPage=20>;rel=self,</products?page=0&perPage=20>;rel=first,</products?page=4&perPage=20>;rel=previous,</products?page=6&perPage=20>;rel=next,</products?page=26&perPage=20>;rel=last
(giá trị tiêu đề Liên kết phải được mã hóa url)
... và có thể tùy chỉnh total-count
phản ứng tiêu đề, nếu bạn lựa chọn:
total-count: 521
Dữ liệu phân trang khác tiết lộ trong siêu dữ liệu con người làm trung tâm có thể là không cần thiết cho siêu dữ liệu máy trung tâm, như các tiêu đề liên kết cho tôi biết trang nào Tôi đang trên và số trên mỗi trang và tôi có thể nhanh chóng truy xuất số lượng bản ghi trong mảng. Do đó, tôi có lẽ sẽ chỉ tạo tiêu đề cho tổng số. Bạn luôn có thể đổi ý sau và thêm siêu dữ liệu.
Ngoài ra, bạn có thể nhận thấy tôi đã xóa /index
khỏi URI của bạn. Một quy ước được chấp nhận chung là phải có bộ sưu tập điểm cuối ReST của bạn. Có /index
ở cuối muddies tăng nhẹ.
Đây chỉ là một vài điều tôi muốn có khi tiêu thụ/tạo API. Hy vọng rằng sẽ giúp!
per_page không tuân theo quy ước page_size –
'" page_count ": 20' và' {"last": "/ products? Page = 26 & per_page = 20"} '? –
điều gì sẽ xảy ra nếu số lượng sản phẩm đột nhiên tăng trong khi tìm nạp tất cả các bản ghi từ trang 1 đến trang x? – MeV