Learning Outcome & Exercises: API Design & Security
Tổng kết chương API Design & Security: học xong mình phải làm được gì, và làm bài tập nào để chứng minh?
Đọc hiểu chưa đủ để đi phỏng vấn. Mỗi chương kết thúc bằng những việc làm được và chứng minh được: có code chạy, có test cho cả trường hợp lỗi, có log hoặc số đo. Bài tập nằm trong repo riêng java-backend-interview-labs, thư mục labs/api.
1. Mục tiêu đầu ra
Học xong chương này, bạn tự làm được:
- Viết OpenAPI contract trước rồi mới code, và test controller theo contract.
- Cài đặt Idempotency-Key cho POST thanh toán và chứng minh request lặp không tạo bản ghi mới.
- Ra phiên bản v2 không phá client v1 (thay đổi additive, deprecation header).
2. Basic: Contract-first
Trạng thái: ⬜ Chưa triển khai: chưa có code/test, chưa tính là hoàn thành
OpenAPI cho /orders (GET/POST/PATCH) với status code đúng; generate hoặc kiểm controller theo spec.
Bài liên quan: REST & resource contract, PUT vs PATCH, status code
Hoàn thành khi:
- File openapi.yaml
- Test status code
3. Intermediate: Idempotency key
Trạng thái: ⬜ Chưa triển khai: chưa có code/test, chưa tính là hoàn thành
POST /payments có Idempotency-Key; gửi 2 lần song song → 1 payment, lần 2 trả cùng response.
Bài liên quan: Error contract & idempotency
Hoàn thành khi:
- Test song song
- Body khác nhưng cùng key → 409/422
4. Challenge: Versioning
Trạng thái: ⬜ Chưa triển khai: chưa có code/test, chưa tính là hoàn thành
Thêm v2 với field mới; contract test chứng minh client v1 vẫn chạy; trả Deprecation/Sunset header cho v1.
Bài liên quan: Versioning, OWASP API Top 10, Secrets & audit
Hoàn thành khi:
- Test v1 và v2 cùng pass
- Danh sách thay đổi breaking/non-breaking
5. Tiêu chí hoàn thành chung
- Tự giải thích được bài toán và vì sao chọn giải pháp.
- Code chạy được bằng lệnh ghi trong README, không chứa secret.
- Có test tự động cho happy path và failure path.
- Có log hoặc số đo trong
evidence/chứng minh kết quả. - Có câu trả lời phỏng vấn ngắn bằng tiếng Việt và tiếng Anh.
- README của lab có link ngược về bài học tương ứng.
6. Lab và trạng thái
| Mức | Bài tập | Trạng thái | Test / bằng chứng |
|---|---|---|---|
| Basic | Contract-first | ⬜ Chưa triển khai: chưa có code/test, chưa tính là hoàn thành | — |
| Intermediate | Idempotency key | ⬜ Chưa triển khai: chưa có code/test, chưa tính là hoàn thành | — |
| Challenge | Versioning | ⬜ Chưa triển khai: chưa có code/test, chưa tính là hoàn thành | — |
Repo lab: java-backend-interview-labs/labs/api. TODO: link GitHub là placeholder cho tới khi repo được push.
evidence/; chỉ đánh dấu xong khi có bằng chứng.Phỏng vấn hỏi về API Design & Security, câu nào hay gặp nhất và trả lời sao?
Q1. Làm sao để client retry POST thanh toán mà không bị trừ tiền hai lần?
🇻🇳 Tiếng Việt:
Client gửi Idempotency-Key; server lưu key cùng kết quả với ràng buộc unique, request trùng key trả lại kết quả cũ thay vì xử lý lại.
🇬🇧 English:
The client sends an Idempotency-Key; the server stores the key with the result under a unique constraint, and a repeated key returns the stored result instead of processing again.
Cách nhớ ngắn gọn
- Mỗi bài tập = code + test + log.
- Luôn có ít nhất một failure case.
- Chưa có bằng chứng thì chưa xong.
Tự kiểm tra
Bài tập Basic (Contract-first) được coi là xong khi nào?
File openapi.yaml; Test status code. Chưa có code chạy và bằng chứng thì chưa tính là xong.
Bài tập Intermediate (Idempotency key) được coi là xong khi nào?
Test song song; Body khác nhưng cùng key → 409/422. Chưa có code chạy và bằng chứng thì chưa tính là xong.
Bài tập Challenge (Versioning) được coi là xong khi nào?
Test v1 và v2 cùng pass; Danh sách thay đổi breaking/non-breaking. Chưa có code chạy và bằng chứng thì chưa tính là xong.