Mục tiêu bước này là chốt hợp đồng giữa client và hệ thống trước khi bàn tới bên trong.
Viết 3-5 endpoint chính, mỗi cái một dòng, kèm tham số và giá trị trả về:
POST /v1/posts { text, mediaIds[] } -> { postId, createdAt }
GET /v1/feed?cursor=&limit=20 -> { items[], nextCursor }
POST /v1/users/{id}/follow -> 204Những điểm nên chủ động nêu:
- Phân trang bằng cursor, không dùng offset. Offset lệch kết quả khi có bản ghi mới chèn vào và tốn kém khi trang ở sâu; cursor ổn định và cho phép index quét tuần tự.
- Idempotency cho thao tác ghi tạo tài nguyên: client gửi
Idempotency-Key, server lưu khóa và trả lại kết quả cũ nếu trùng. Xử lý được trường hợp người dùng bấm hai lần hoặc client tự retry sau timeout. - Versioning đặt trong đường dẫn (
/v1/) hoặc header, để đổi hợp đồng mà không phá client cũ. - Mã lỗi và định dạng lỗi thống nhất: 4xx cho lỗi phía client, 5xx cho lỗi phía server, thân lỗi có
codemáy đọc được thay vì chỉ chuỗi tiếng Anh. - Đọc nặng thì tách endpoint đọc riêng để cache theo tài nguyên, không trộn nhiều mục đích vào một endpoint.
Nêu luôn lý do chọn REST hay gRPC: gRPC hợp cho giao tiếp nội bộ giữa service (payload nhị phân, streaming, hợp đồng chặt), REST/JSON hợp cho client công khai và trình duyệt.