Giữ một quy ước duy nhất cho mọi collection endpoint, đừng mỗi endpoint một kiểu.
http
GET /orders?status=paid&created_after=2026-01-01
&sort=-created_at,id
&fields=id,total,customer.name
&page_size=50&page_token=eyJ...- Filter: field đơn giản thì đặt thẳng làm query param (
status=paid). Cần biểu thức phức tạp thì dùng một paramfiltervới cú pháp cố định (filter=status=paid AND total>100000) như Google API design guide, thay vì đẻ rastatus_in,total_gte,total_lte... - Sort:
sort=-created_at,id— dấu-là giảm dần, nhiều key phân tách bằng dấu phẩy. Luôn thêm khoá phụ duy nhất (id) để thứ tự tất định, nếu không phân trang sẽ nhảy record. - Sparse fieldset:
fields=id,totalđể client bớt payload. Với API có quan hệ, thêminclude=customer(kiểu JSON:API) thay vì luôn nhồi mọi quan hệ vào response.
Phần an toàn — thường là ý phỏng vấn muốn nghe:
- Filter và sort đi thẳng vào SQL → phải allowlist tên field được lọc/sắp xếp. Không bao giờ nội suy chuỗi từ client vào ORDER BY; param hoá giá trị và map tên field qua bảng cố định.
- Chỉ cho sort trên field có index, nếu không một request lạ sẽ quét toàn bảng.
- page_size phải có giá trị mặc định và trần cứng (vd default 20, max 100) — không thì client gửi page_size=1000000.
- fields phải lọc sau tầng phân quyền, đừng để client "chọn" ra field mà họ không được xem.