API Design: Xây dựng Giao diện Lập trình Chuyên nghiệp
Một API tốt giống như một quản gia tận tụy: nó thực hiện đúng yêu cầu, dễ giao tiếp và không bao giờ gây bất ngờ tiêu cực cho người dùng.
#Người mới bắt đầu (Beginner)
Q1: REST API là gì?
Trả lời: Representational State Transfer. Là một phong cách kiến trúc sử dụng các phương thức HTTP (GET, POST, PUT, DELETE) để thao tác với tài nguyên (Resources) qua URL.
Q2: Tài nguyên (Resource) trong API nên được đặt tên như thế nào?
Trả lời:
Nên dùng danh từ số nhiều. Ví dụ: /users, /orders thay vì /getUser hoặc /all-orders.
Q3: Tại sao cần dùng Status Codes (mã trạng thái)?
Trả lời: Để Client biết nhanh kết quả mà không cần đọc nội dung: 200 (OK), 201 (Created), 400 (Bad Request), 404 (Not Found), 500 (Server Error).
Q4: JSON là gì và tại sao nó phổ biến trong API?
Trả lời: JavaScript Object Notation. Nó nhẹ, dễ đọc cho cả người và máy, và được hầu hết các ngôn ngữ lập trình hỗ trợ.
Q5: Phân biệt tham số Query (`?id=1`) và tham số Path (`/users/1`).
Trả lời:
- Path: Dùng để xác định 1 tài nguyên cụ thể.
- Query: Dùng để lọc, sắp xếp hoặc phân trang danh sách tài nguyên.
Q6: API Documentation là gì?
Trả lời: Là tài liệu hướng dẫn cách sử dụng API (endpoint, tham số, dữ liệu trả về). Công cụ phổ biến nhất là Swagger/OpenAPI.
Q7: Stateless trong API nghĩa là gì?
Trả lời: Mỗi request từ client phải chứa đầy đủ thông tin để server hiểu và xử lý, server không lưu giữ “trạng thái” của client giữa các lần gọi.
Q8: Payload trong một API Request là gì?
Trả lời: Là phần thân (Body) chứa dữ liệu thực tế được gửi lên server, thường dùng cho POST, PUT, PATCH.
Q9: API Key dùng để làm gì?
Trả lời: Là một chuỗi định danh để server biết client nào đang gọi và có quyền truy cập hay không.
Q10: Sự khác biệt giữa Public API và Private API.
Trả lời:
- Public: Bất kỳ ai cũng có thể sử dụng (thường cần đăng ký).
- Private: Chỉ dùng nội bộ trong công ty hoặc giữa các service của chính mình.
#Trung cấp (Intermediate)
Q1: Versioning API - Tại sao cần và các cách thực hiện?
Trả lời:
Để không làm hỏng các client cũ khi API thay đổi. Cách làm: URL (/v1/users), Header (Accept: v1), hoặc Query string (?version=1).
Q2: Giải thích về Idempotency trong thiết kế API.
Trả lời: Một API là lũy đẳng nếu gọi nhiều lần với cùng dữ liệu thì kết quả trên hệ thống vẫn như gọi 1 lần (GET, PUT, DELETE là lũy đẳng; POST thì không).
Q3: HATEOAS là gì trong REST?
Trả lời: Hypermedia as the Engine of Application State. Server trả về dữ liệu kèm theo các đường link dẫn tới các hành động tiếp theo có thể thực hiện.
Q4: Thiết kế cơ chế Phân trang (Pagination) hiệu quả.
Trả lời:
Dùng page & limit (Offset-based) hoặc cursor (Cursor-based). Cursor-based tốt hơn cho dữ liệu lớn và thay đổi liên tục.
Q5: Cách xử lý Error Response chuẩn (Error Object).
Trả lời:
Nên trả về một object có cấu trúc thống nhất: error_code, message, và details (nếu cần cho validation).
Q6: Rate Limiting - Làm thế nào để bảo vệ API khỏi bị lạm dụng?
Trả lời:
Dùng thuật toán Token Bucket hoặc Leaky Bucket. Trả về lỗi 429 (Too Many Requests) kèm header Retry-After.
Q7: Phân biệt PUT và PATCH về mặt ngữ nghĩa và triển khai.
Trả lời:
- PUT: Thay thế toàn bộ tài nguyên (nếu thiếu trường sẽ bị null/default).
- PATCH: Chỉ cập nhật các trường được gửi lên (giữ nguyên các trường khác).
Q8: Cách thiết kế API hỗ trợ đa ngôn ngữ (Localization).
Trả lời:
Dùng header Accept-Language hoặc tham số query ?lang=vi.
Q9: "Filtering" và "Sorting" trong API danh sách.
Trả lời:
Dùng query string rõ ràng. Ví dụ: ?status=active&sort=-created_at (dấu trừ đại diện cho DESC).
Q10: Bảo mật API bằng JWT (JSON Web Token) hoạt động thế nào?
Trả lời:
Client gửi username/pass -> Server trả về Token -> Client lưu và đính kèm Token vào Header Authorization: Bearer <token> cho mọi request sau.
#Nâng cao (Advanced)
Q1: Khi nào chọn GraphQL thay vì REST? Phân tích sự đánh đổi.
Trả lời: Chọn GraphQL khi Client cần lấy dữ liệu phức tạp từ nhiều nguồn trong 1 request và muốn tránh Over-fetching. Đánh đổi: Caching phức tạp hơn, rủi ro query quá nặng làm sập server.
Q2: gRPC là gì? Tại sao nó nhanh hơn REST/JSON?
Trả lời: Dùng HTTP/2 và Protocol Buffers (Binary format). Dữ liệu được nén nhỏ, truyền nhanh, hỗ trợ streaming 2 chiều và Strong typing.
Q3: Thiết kế cơ chế Webhooks an toàn.
Trả lời:
Server bắn request tới Client khi có sự kiện. An toàn: Dùng X-Hub-Signature (HMAC) để client xác thực request thực sự đến từ server mình.
Q4: Làm thế nào để xử lý "Long-running Tasks" qua API?
Trả lời:
Trả về 202 Accepted kèm job_id. Client sẽ polling vào endpoint /jobs/{id} để kiểm tra trạng thái hoặc server bắn Webhook khi xong.
Q5: Phân tích cơ chế "API Gateway" trong hệ thống Microservices.
Trả lời: Là cổng vào duy nhất, chịu trách nhiệm: Routing, Authentication, Rate Limiting, Logging, và Response Aggregation (gộp data từ nhiều service).
Q6: Cách thiết kế API hỗ trợ "Batch Requests" (nhiều hành động trong 1 call).
Trả lời: Nhận một mảng các operations. Cần quyết định xem nếu 1 cái lỗi thì có rollback tất cả (Atomic) hay vẫn xử lý các cái khác (Partial success).
Q7: Giải thích về "Idempotency Key" trong các API thanh toán.
Trả lời: Client gửi kèm 1 key duy nhất. Nếu server nhận được 2 request cùng key, nó sẽ trả về kết quả của lần đầu thay vì thực hiện giao dịch lần 2.
Q8: Làm thế nào để tối ưu "API Response Time" (TTFB)?
Trả lời: Dùng Eager loading, Caching (Redis), Gzip compression, và giảm thiểu số lượng Join trong database.
Q9: Phân biệt "Internal API" và "External API" về mặt thiết kế bảo mật.
Trả lời: Internal có thể dùng mTLS, tin tưởng lẫn nhau hơn. External cần OAuth2, Rate limit gắt gao, và tài liệu cực kỳ chi tiết.
Q10: "API First Design" là gì?
Trả lời: Viết tài liệu (OpenAPI spec) trước khi viết code. Giúp team Frontend và Backend có thể làm việc song song dựa trên “hợp đồng” đã chốt.
#Kiến trúc sư (Architect)
Q1: Thiết kế hệ thống API cho ứng dụng Global phục vụ 100 triệu người dùng.
Trả lời: Dùng Edge Computing/CDN để cache response. Triển khai API Gateway đa vùng (Multi-region). Dùng cơ chế Token-based Auth stateless để dễ scale ngang.
Q2: Làm thế nào để thực hiện "Zero-downtime API Migration" khi thay đổi hoàn toàn cấu trúc dữ liệu?
Trả lời: Hỗ trợ song song cả 2 version. Dùng Adapter layer để map dữ liệu cũ sang mới. Monitor traffic và dần dần tắt version cũ sau khi thông báo cho client.
Q3: Phân tích chiến lược "BFF" (Backend For Frontend).
Trả lời: Tạo các service riêng cho từng loại client (Mobile, Web, IoT) để tối ưu hóa payload và logic phù hợp nhất cho từng thiết bị.
Q4: Thiết kế giải pháp "Service Mesh" cho giao tiếp giữa hàng nghìn API nội bộ.
Trả lời: Dùng Istio/Linkerd. Tách biệt logic hạ tầng (Retries, Circuit breaker, Auth) ra khỏi mã nguồn ứng dụng qua Sidecar proxy.
Q5: Tầm nhìn: Sự trỗi dậy của Event-driven API (AsyncAPI).
Trả lời: Thay vì Request-Response truyền thống, hệ thống giao tiếp qua Events. Dùng AsyncAPI để mô tả các message, channel giúp hệ thống cực kỳ linh hoạt và chịu tải tốt.
#Tình huống thực tế (Practical Scenarios)
S1: Client phàn nàn API trả về quá nhiều dữ liệu thừa làm chậm app mobile. Giải pháp?
Xử lý: 1. Triển khai tham số ?fields=id,name để client tự chọn cột. 2. Hoặc xây dựng GraphQL layer. 3. Hoặc dùng BFF để trả về payload thu gọn.
S2: API của bạn bị tấn công Brute-force vào endpoint đăng nhập. Cách xử lý?
Xử lý: 1. Implement Rate Limiting theo IP và Username. 2. Bật cơ chế Account Lockout sau 5 lần sai. 3. Trả về mã lỗi chung (không báo là sai pass hay sai user).
#Nên biết
- Các phương thức HTTP và Status Codes.
- Cách thiết kế URL chuẩn RESTful.
- Bảo mật API cơ bản (Auth, Rate limit).
#Lưu ý
- Trả về lỗi 200 kèm nội dung “error: true” (sai nguyên tắc HTTP).
- Không có tài liệu (Document) hoặc tài liệu sai lệch với code.
- Để lộ thông tin nhạy cảm (như mật khẩu, token) trong URL.
#Mẹo và thủ thuật
- Luôn sử dụng
Snake_casehoặccamelCasethống nhất cho toàn bộ API. - Dùng
UUIDthay vìAuto-increment IDtrong URL để bảo mật thông tin.
Bài viết liên quan
Tiếp tục hành trình nâng tầm kiến thức của bạn
API Design: Xây dựng Giao diện Lập trình Chuyên nghiệp
Hệ thống hơn 50 câu hỏi về RESTful, gRPC, GraphQL, Versioning, Security và thiết kế API có khả năng mở rộng.
HTTP & Web Fundamentals: Nền tảng của Internet
Hệ thống hơn 50 câu hỏi chuyên sâu về HTTP/2, HTTP/3, Security Headers, Web Caching và RESTful API.
Advanced System Design: Thiết kế hệ thống chịu tải cao
Hệ thống câu hỏi về Sharding, Partitioning, Load Balancing tầng 4/7, và kiến trúc High Availability cho Senior Engineer.