REST API vận hành phần lớn các tích hợp trên internet. Dù bạn ứng tuyển vai trò backend, full stack hay kỹ sư phần mềm, nhiều khả năng bạn sẽ gặp các câu hỏi về thiết kế REST API, phương thức HTTP và các mẫu xác thực.
Trong hướng dẫn này, tôi sẽ dẫn bạn qua những câu hỏi nhà tuyển dụng thực sự hay hỏi. Tôi đã sắp xếp chúng theo mức độ khó và loại vai trò, để bạn tập trung vào những gì quan trọng nhất cho vị trí mục tiêu. Mỗi câu trả lời đều kèm ví dụ thực tế và, khi phù hợp, các đoạn mã bạn có thể điều chỉnh.
Một điều cần nhớ: nhà tuyển dụng kiểm tra nền tảng cơ bản thường xuyên hơn nhiều so với các chủ đề nâng cao. Nếu bạn nắm chắc những điều căn bản (phương thức HTTP, mã trạng thái, tính vô trạng), bạn sẽ tự tin xử lý hầu hết các buổi phỏng vấn REST API. Những mẫu kiến trúc cầu kỳ sẽ đến sau.
Câu hỏi Phỏng vấn REST API Cơ bản
Những câu hỏi này kiểm tra kiến thức nền tảng của bạn. Hãy kỳ vọng gặp chúng trong hầu như mọi buổi phỏng vấn, bất kể cấp độ thâm niên.
1. REST là gì và các ràng buộc của nó?
REST là viết tắt của Representational State Transfer. Đây là một phong cách kiến trúc để thiết kế các ứng dụng mạng, được Roy Fielding định nghĩa trong luận án tiến sĩ năm 2000.
REST có sáu ràng buộc:
Client-Server: Tách biệt giữa giao diện người dùng và lưu trữ dữ liệu
Stateless: Mỗi yêu cầu chứa đầy đủ thông tin cần để hoàn thành
Cacheable: Phản hồi phải chỉ rõ có thể được lưu đệm hay không
Layered System: Các thành phần không thể nhìn vượt quá lớp liền kề
Uniform Interface: Cách thức chuẩn hóa để tương tác với tài nguyên
Code-on-Demand (tùy chọn): Máy chủ có thể gửi mã thực thi tới máy khách
2. Sự khác nhau giữa REST và SOAP là gì?
REST là một phong cách kiến trúc; SOAP là một giao thức. REST thường dùng JSON qua HTTP và tận dụng các phương thức HTTP tiêu chuẩn. SOAP chỉ dùng XML và định nghĩa định dạng thông điệp riêng với phong bì và headers.
Khía cạnh
REST
SOAP
Định dạng
JSON, XML, khác
Chỉ XML
Vận chuyển
HTTP
HTTP, SMTP, khác
Bộ nhớ đệm
Bộ nhớ đệm HTTP gốc
Không thể lưu đệm
Hiệu năng
Nhẹ
Độ trễ cao hơn
SOAP vẫn có ý nghĩa với các hệ thống doanh nghiệp cần hợp đồng chính thức (WSDL) hoặc bảo mật cấp thông điệp (WS-Security).
3. Các phương thức HTTP là gì và dùng khi nào?
Các phương thức HTTP xác định hành động cần thực hiện trên một tài nguồn.
Phương thức
Mục đích
Ví dụ
GET
Truy xuất một tài nguyên
GET /users/123
POST
Tạo tài nguyên mới
POST /users
PUT
Thay thế toàn bộ tài nguyên
PUT /users/123
PATCH
Cập nhật một phần tài nguyên
PATCH /users/123
DELETE
Xóa một tài nguyên
DELETE /users/123
4. Sự khác nhau giữa PUT và POST là gì?
POST tạo một tài nguyên mới, nơi máy chủ quyết định URI. PUT thay thế một tài nguyên tại một URI cụ thể do máy khách chỉ định.
POST /users → Server creates user, returns /users/123
PUT /users/123 → Client specifies URI, replaces entire resourceĐược hỗ trợ bởi
Nếu bạn PUT tới một URI chưa tồn tại, máy chủ có thể tạo mới. Nếu bạn PUT tới một URI đã tồn tại, bạn sẽ thay thế toàn bộ tài nguyên.
5. Sự khác nhau giữa PUT và PATCH là gì?
PUT thay thế toàn bộ tài nguyên. PATCH áp dụng các sửa đổi từng phần.
# PUT replaces everything
PUT /users/123{"name":"Khalid","email":"[email protected]","role":"admin"}# PATCH updates only specified fields
PATCH /users/123{"role":"admin"}Được hỗ trợ bởi
6. "Stateless" trong REST nghĩa là gì?
Stateless nghĩa là mỗi yêu cầu phải chứa toàn bộ thông tin máy chủ cần để xử lý. Máy chủ không lưu bất kỳ ngữ cảnh khách hàng nào giữa các yêu cầu.
Điều này đồng nghĩa không có session phía máy chủ. Nếu người dùng đã xác thực, máy khách phải gửi thông tin xác thực (thường là token) trong mọi yêu cầu.
7. Điều gì làm cho một API là RESTful?
Một API thực sự RESTful khi thỏa mãn tất cả ràng buộc REST, bao gồm HATEOAS (Hypermedia as the Engine of Application State). Trên thực tế, hầu hết API tự nhận là "REST" thực ra là "giống REST" hoặc ở Mức 2 của Mô hình Trưởng thành Richardson. Và thành thật mà nói, điều đó là ổn cho đa số trường hợp.
Các mức trong Mô hình Trưởng thành Richardson cho REST API. Hình do Tác giả thực hiện.
8. Những mã trạng thái HTTP cơ bản nào bạn nên biết?
Bạn nên quen thuộc với ít nhất bảy mã trạng thái thiết yếu này, bao quát phần lớn tình huống API:
Mã
Tên
Khi sử dụng
200
OK
GET, PUT, PATCH thành công
201
Created
POST thành công (kèm header Location)
204
No Content
DELETE thành công
400
Bad Request
Cú pháp sai
404
Not Found
Tài nguyên không tồn tại
500
Internal Server Error
Lỗi phía máy chủ
9. Sự khác nhau giữa tài nguyên và endpoint là gì?
Tài nguyên là thực thể dữ liệu (người dùng, đơn hàng, sản phẩm). Endpoint là đường dẫn URL cung cấp quyền truy cập tới tài nguyên đó.
Resource: User
Endpoints: GET /users, GET /users/123, POST /usersĐược hỗ trợ bởi
10. Thực hành tốt cho thiết kế URI là gì?
Dùng danh từ, không dùng động từ. Để URI viết thường với dấu gạch nối cho tên nhiều từ. Dùng danh từ số nhiều cho tập hợp.
Tránh lồng quá sâu. Thay vì /users/123/posts/456/comments/789, hãy cân nhắc /comments/789 hoặc /comments?post_id=456.
11. Tính idempotent là gì và những phương thức HTTP nào là idempotent?
Một thao tác là idempotent nếu thực hiện nhiều lần cho ra kết quả giống như thực hiện một lần.
Phương thức
Idempotent
Lý do
GET
Có
Đọc không thay đổi trạng thái
PUT
Có
Thay thế bằng cùng dữ liệu cho ra cùng kết quả
DELETE
Có
Xóa hai lần vẫn là đã bị xóa
POST
Không
Tạo hai lần tạo hai tài nguyên
PATCH
Không*
Phụ thuộc vào thao tác
Một PATCH đặt một giá trị là idempotent; một PATCH tăng bộ đếm thì không.
12. Sự khác nhau giữa phương thức an toàn (safe) và idempotent?
Phương thức an toàn không sửa đổi tài nguyên (GET, HEAD, OPTIONS). Phương thức idempotent có thể gọi nhiều lần với cùng hiệu ứng (GET, PUT, DELETE).
Tất cả phương thức an toàn đều idempotent, nhưng không phải mọi phương thức idempotent đều an toàn. DELETE là idempotent nhưng không an toàn vì nó sửa đổi trạng thái.
13. Khi nào dùng tham số truy vấn so với tham số đường dẫn?
Tham số đường dẫn định danh một tài nguyên cụ thể. Tham số truy vấn lọc, sắp xếp hoặc phân trang tập hợp.
14. Đàm phán nội dung (content negotiation) là gì?
Đàm phán nội dung cho phép máy khách yêu cầu các biểu diễn khác nhau của một tài nguyên. Máy khách gửi header Accept, và máy chủ phản hồi với định dạng phù hợp.
Accept: application/json → Server returns JSON
Accept: application/xml → Server returns XMLĐược hỗ trợ bởi
15. Mục đích của phương thức OPTIONS là gì?
OPTIONS trả về các phương thức HTTP mà máy chủ hỗ trợ cho một URL cụ thể. Trình duyệt dùng nó cho yêu cầu thăm dò CORS để kiểm tra có cho phép yêu cầu cross-origin hay không.
Câu hỏi Phỏng vấn REST API Trung cấp
Những câu hỏi này kiểm tra khả năng ứng dụng thực tế và ra quyết định. Hãy kỳ vọng cho vị trí tầm trung.
16. Sự khác nhau giữa 401 và 403?
Đây là cặp mã trạng thái hay bị nhầm nhất. Tôi đã thấy cả kỹ sư cao cấp cũng lẫn lộn trong các buổi review mã.
401 Unauthorized
Nghĩa là chưa xác thực. Máy chủ không biết bạn là ai. Phản hồi của bạn nên nhắc người dùng đăng nhập.
403 Forbidden
Nghĩa là không được phép. Máy chủ biết bạn là ai nhưng bạn thiếu quyền. Xác thực lại cũng không giúp gì.
Lưu đồ quyết định lỗi xác thực so với phân quyền. Hình do Tác giả thực hiện.
17. Sự khác nhau giữa 400 và 422?
Dưới đây là ví dụ minh họa sự khác biệt:
400 Bad Request
Chỉ ra cú pháp sai. Máy chủ không thể phân tích yêu cầu (cấu trúc JSON không hợp lệ, thiếu header bắt buộc).
422 Unprocessable Entity
Chỉ ra cú pháp hợp lệ nhưng lỗi ngữ nghĩa. JSON hợp lệ nhưng dữ liệu không qua xác thực (định dạng email sai, mật khẩu quá ngắn).
ETag là định danh phiên bản cho một tài nguyên. Máy chủ gửi nó trong phản hồi; máy khách gửi lại trong các yêu cầu sau để kiểm tra tài nguyên có thay đổi không.
# First request
GET /users/123
Response: ETag: "abc123"
# Subsequent request
GET /users/123
If-None-Match: "abc123"
Response: 304 Not Modified (if unchanged)Được hỗ trợ bởi
22. Những phương thức xác thực nào dùng cho REST API?
Bốn phương thức xác thực phổ biến là API Key, Bearer Token, OAuth 2.0 và JWT:
Máy chủ ký token; máy khách gửi kèm trong yêu cầu. Máy chủ xác thực chữ ký mà không cần tra cứu cơ sở dữ liệu.
24. Sự khác nhau giữa RS256 và HS256?
HS256 (đối xứng): Cùng một bí mật dùng để ký và xác minh. Rủi ro nếu nhiều dịch vụ cần xác minh token.
RS256 (bất đối xứng): Khóa riêng ký, khóa công khai xác minh. Khuyến nghị cho hệ thống phân tán nơi nhiều dịch vụ xác thực token.
25. HATEOAS là gì?
HATEOAS (Hypermedia as the Engine of Application State) nghĩa là phản hồi bao gồm các liên kết tới hành động và tài nguyên liên quan.
{"id":123,"name":"Khalid","links":[{"rel":"self","href":"/users/123"},{"rel":"orders","href":"/users/123/orders"}]}Được hỗ trợ bởi
Trên thực tế, đa số API không triển khai đầy đủ HATEOAS. Hãy biết khái niệm này nhưng đừng kỳ vọng phải triển khai trong hầu hết công việc. Ngay cả các công ty công nghệ lớn cũng hiếm khi xây dựng API tuân thủ HATEOAS hoàn toàn.
26. Bạn xử lý lỗi nhất quán như thế nào?
Dùng định dạng RFC 7807 Problem Details cho phản hồi lỗi nhất quán:
{"type":"https://api.example.com/errors/validation","title":"Validation Error","status":422,"detail":"Email format is invalid","instance":"/users"}Được hỗ trợ bởi
27. Hạn chế tốc độ (rate limiting) là gì và vì sao quan trọng?
Rate limiting bảo vệ API khỏi lạm dụng và đảm bảo sử dụng công bằng. Phản hồi phổ biến:
HTTP/1.1 429 Too Many Requests
Retry-After: 3600
X-RateLimit-Limit: 1000
X-RateLimit-Remaining: 0Được hỗ trợ bởi
28. Bạn thiết kế lọc và sắp xếp thế nào?
Dùng tham số truy vấn với quy ước rõ ràng:
# Filtering
GET /products?category=electronics&price[gte]=100&price[lte]=500
# Sorting (prefix - for descending)
GET /users?sort=-created_at,nameĐược hỗ trợ bởi
Câu hỏi Phỏng vấn REST API Nâng cao
Những câu hỏi này kiểm tra tư duy kiến trúc. Hãy kỳ vọng cho vị trí cấp cao.
29. Có gì thay đổi giữa OAuth 2.0 và OAuth 2.1?
OAuth 2.1 hợp nhất các thực hành bảo mật tốt nhất:
Tính năng
OAuth 2.0
OAuth 2.1
PKCE
Tùy chọn
Bắt buộc cho TẤT CẢ client
Implicit Grant
Hỗ trợ
Loại bỏ
Password Grant
Hỗ trợ
Loại bỏ
Redirect URI
Khớp linh hoạt
Yêu cầu khớp chính xác
Điểm mấu chốt: dùng luồng Authorization Code với PKCE cho mọi loại client.
30. Bạn triển khai idempotency cho endpoint thanh toán thế nào?
Dùng idempotency key để khiến yêu cầu POST an toàn khi retry:
asyncdefhandle_payment(request: Request, payment: PaymentCreate):
idempotency_key = request.headers.get("Idempotency-Key")# Check if already processed
cached =await redis.get(f"idem:{idempotency_key}")if cached:return JSONResponse(json.loads(cached))# Process payment
result =await process_payment(payment)# Cache result (24-hour TTL)await redis.setex(f"idem:{idempotency_key}",86400, json.dumps(result))return resultĐược hỗ trợ bởi
Máy khách tạo một UUID và gửi kèm theo yêu cầu. Nếu cùng key đến lần nữa, trả về phản hồi đã lưu.
31. Bạn thiết kế rate limiter phân tán như thế nào?
Với hệ thống phân tán, bạn không thể dùng bộ đếm trong bộ nhớ vì lưu lượng được cân bằng qua nhiều instance. Đây là cạm bẫy thường làm ứng viên vấp ngã.
Kiến trúc:
Dùng Redis để lưu trữ bộ đếm tập trung
Triển khai thuật toán Token Bucket để chịu bùng nổ
Dùng thao tác nguyên tử (Lua script) để tránh điều kiện tranh chấp
# Pseudocode for Token Bucket
tokens = redis.get(user_id)or max_tokens
if tokens >0:
redis.decr(user_id)
process_request()else:return429Được hỗ trợ bởi
32. Khi nào bạn chọn gRPC thay vì REST?
Lựa chọn giữa gRPC và REST phụ thuộc vào yêu cầu cụ thể của bạn.
Chọn gRPC khi:
Giao tiếp nội bộ microservice (thông lượng tăng 5-10 lần)
Yêu cầu streaming thời gian thực
Mobile-to-backend với băng thông hạn chế
Môi trường đa ngôn ngữ cần hợp đồng nghiêm ngặt
Chọn REST khi:
API công khai với nhiều đối tượng sử dụng
Ứng dụng web (hỗ trợ trình duyệt phổ quát)
CRUD đơn giản
Nhóm chưa quen với Protocol Buffers
33. Bạn xử lý tác vụ chạy lâu như thế nào?
Dùng mẫu yêu cầu bất đồng bộ:
Máy khách gửi yêu cầu
Máy chủ trả về 202 Accepted kèm URL trạng thái
Máy khách thăm dò URL trạng thái đến khi hoàn tất
POST /reports
Response: 202 Accepted
Location: /reports/abc123/status
GET /reports/abc123/status
Response: {"status": "processing", "progress": 45}
GET /reports/abc123/status
Response: {"status": "completed", "result_url": "/reports/abc123"}Được hỗ trợ bởi
34. Mẫu (pattern) Saga là gì?
Saga xử lý giao dịch phân tán trên nhiều microservice mà không cần khóa. Mỗi dịch vụ thực hiện một giao dịch cục bộ và phát sự kiện. Nếu một bước thất bại, các giao dịch bù hoàn tác các bước trước.
Order Created → Payment Processed → Inventory Reserved → Order Confirmed
↓ (failure)
Release Payment → Cancel OrderĐược hỗ trợ bởi
35. Các lỗ hổng bảo mật JWT phổ biến?
Nhầm lẫn thuật toán: Kẻ tấn công đổi RS256 sang HS256 và ký bằng khóa công khai. Cách khắc phục: luôn whitelist thuật toán.
Bạn nên giám sát bốn chỉ số then chốt này để đánh giá sức khỏe API:
Chỉ số
Mô tả
Ngưỡng cảnh báo
Độ trễ P50
Thời gian phản hồi trung vị
Đường cơ sở
Độ trễ P99
Chậm nhất 1%
> 2s trong 5 phút
Tỷ lệ lỗi
% 4xx/5xx
> 1% trong 5 phút
Thông lượng
Số yêu cầu mỗi giây
Lập kế hoạch năng lực
Câu hỏi REST API cho Lập trình viên Full Stack
Những câu hỏi này kiểm tra hiểu biết của bạn về cả phía máy khách và máy chủ, đặc biệt là bảo mật trình duyệt, quản lý trạng thái và giao tiếp cross-origin.
41. Khi nào trình duyệt gửi yêu cầu thăm dò CORS?
Trình duyệt gửi OPTIONS preflight khi:
Phương thức khác GET, HEAD, POST
Header tùy chỉnh (Authorization, X-API-Key)
Content-Type khác form-urlencoded, multipart/form-data, text/plain
42. Bạn cấu hình CORS an toàn như thế nào?
Cấu hình CORS an toàn yêu cầu whitelist rõ ràng nguồn (origin) và xử lý cẩn thận thông tin xác thực. Đây là thiết lập Express.js an toàn:
// Express.js
app.use(cors({origin:['https://yourdomain.com'],// Never use * with credentialscredentials:true,methods:['GET','POST','PUT','DELETE'],allowedHeaders:['Content-Type','Authorization']}));Được hỗ trợ bởi
Không bao giờ dùng wildcard (*) với thông tin xác thực. Không bao giờ cho phép null origin.
43. Bạn nên lưu token ở đâu trên máy khách?
Lưu trữ token liên quan đến đánh đổi bảo mật giữa lỗ hổng XSS và CSRF"
Lưu trữ
Rủi ro XSS
Rủi ro CSRF
Khuyến nghị
localStorage
Cao
Không
Tránh dùng cho token
HttpOnly Cookie
Thấp
Cần giảm thiểu
Khuyến nghị
In-memory
Thấp
Thấp
Tốt nhất cho access token
Thực hành tốt nhất: Lưu refresh token trong cookie HttpOnly vớiSameSite=Strict. Giữ access token trong bộ nhớ.
44. Khi nào dùng WebSockets so với SSE?
Lựa chọn phụ thuộc vào việc bạn có cần giao tiếp hai chiều hay không và cách bạn muốn xử lý kết nối lại:
Tính năng
WebSockets
SSE
Hướng
Hai chiều
Từ máy chủ đến máy khách
Kết nối lại
Thủ công
Tự động
Dữ liệu nhị phân
Có
Không
Dùng SSE cho thông báo, luồng trực tiếp, bảng giá cổ phiếu. Dùng WebSockets cho chat, game nhiều người, soạn thảo cộng tác.
45. Bạn xử lý tải lên tệp như thế nào?
Với tệp lớn, dùng tải lên theo khối (chunk) kèm theo theo dõi tiến độ:
asyncfunctionchunkedUpload(file, chunkSize =5*1024*1024){const totalChunks = Math.ceil(file.size / chunkSize);for(let i =0; i < totalChunks; i++){const chunk = file.slice(i * chunkSize,(i +1)* chunkSize);awaituploadChunk(uploadId, i, chunk);}}Được hỗ trợ bởi
Câu hỏi REST API theo Kịch bản
Những câu hỏi này đánh giá khả năng áp dụng nguyên tắc REST vào bài toán thực tế. Nhà tuyển dụng muốn thấy quy trình thiết kế và cách bạn đưa ra đánh đổi kiến trúc.
46. Thiết kế REST API cho hệ thống đặt phòng khách sạn
Một hệ thống đặt phòng khách sạn cần xử lý tìm kiếm, kiểm tra tình trạng phòng và đặt chỗ, đồng thời ngăn đặt trùng. Dưới đây là các tài nguyên cốt lõi:
Tài nguyên:
/hotels - Liệt kê và tìm kiếm khách sạn
/hotels/{id}/rooms - Phòng còn trống
/bookings - Tạo và quản lý đặt chỗ
/guests/{id} - Hồ sơ khách
Quyết định chính:
Dùng phân trang theo cursor cho tìm kiếm khách sạn
Triển khai khóa lạc quan cho tình trạng phòng
Trả về 409 Conflict khi cố đặt trùng
Dùng idempotency key cho xử lý thanh toán
47. Bạn sẽ triển khai xóa mềm (soft delete) như thế nào?
48. Bạn di trú từ v1 sang v2 mà không làm hỏng client như thế nào?
Dùng mẫu Cây Đa Bóp Nghẹt (Strangler Fig):
Triển khai v2 song song với v1
Định tuyến tính năng mới sang v2
Di trú dần các endpoint hiện có
Thông báo ngừng hỗ trợ qua header Sunset
Gỡ v1 sau thời gian di trú
49. Bạn thiết kế API tìm kiếm với lọc phức tạp như thế nào?
Với tìm kiếm sản phẩm có nhiều bộ lọc:
GET /products?q=laptop&category=electronics&price[gte]=500&price[lte]=2000&brand=apple,dell&in_stock=true&sort=-rating&limit=20&cursor=abc123Được hỗ trợ bởi
Quyết định thiết kế:
Dùng Elasticsearch cho full-text search (CSDL quan hệ khó xử lý so khớp mờ)
Triển khai tìm kiếm theo tiêu chí (faceted) để hiển thị tùy chọn lọc sẵn có
Trả về số lượng theo bộ lọc để người dùng biết mỗi bộ lọc cho ra bao nhiêu kết quả
Lưu đệm các tổ hợp tìm kiếm phổ biến
50. Bạn xử lý quản lý phiên bản API trong kiến trúc microservices như thế nào?
Tùy chọn:
Phiên bản ở cấp gateway: API gateway định tuyến /v1/* tới dịch vụ cũ, /v2/*tới dịch vụ mới
Phiên bản ở cấp dịch vụ: Mỗi dịch vụ tự xử lý thương lượng phiên bản
Hợp đồng do bên tiêu thụ chi phối: Dùng Pact hoặc công cụ tương tự để đảm bảo tương thích
Với đa số nhóm, phiên bản ở cấp gateway mang lại sự tách biệt gọn gàng nhất.
51. Bạn sẽ triển khai rate limiting cho các hạng người dùng khác nhau như thế nào?
Giải pháp gồm định nghĩa giới hạn theo hạng và kiểm tra bằng bộ đếm Redis:
Những câu hỏi này đánh giá kỹ năng giao tiếp và cách bạn xử lý thách thức API thực tế. Hãy tập trung thể hiện quy trình giải quyết vấn đề và cách bạn làm việc với các bên liên quan.
52. Giải thích REST cho người không kỹ thuật
"Hãy nghĩ REST API như một người bồi bàn trong nhà hàng. Bạn (khách) không thể vào bếp trực tiếp. Thay vào đó, bạn nói với bồi bàn bạn muốn gì từ thực đơn, và họ mang đến cho bạn. Thực đơn giống như tài liệu API, liệt kê những gì bạn có thể gọi. Bồi bàn theo quy tắc cụ thể: bạn yêu cầu món (GET), bạn đặt món mới (POST), hoặc bạn trả lại món (DELETE). Nếu bếp hết món gì đó, bồi bàn sẽ báo bạn (404 Not Found) để bạn không chờ vô ích."
Phép so sánh này hoạt động đáng ngạc nhiên trong các buổi họp với stakeholder.
53. Mô tả một lần bạn tối ưu một API
Dùng phương pháp STAR:
Tình huống: "API tìm kiếm của chúng tôi có thời gian phản hồi 3 giây lúc cao điểm"
Nhiệm vụ: "Tôi cần giảm độ trễ mà không thay đổi lớn kiến trúc"
Hành động: "Tôi thêm Redis caching cho các truy vấn thường gặp, triển khai phân trang theo cursor và thêm index cơ sở dữ liệu"
Kết quả: "Thời gian phản hồi giảm còn 200ms, và chúng tôi xử lý nhiều hơn gấp 5 lần lưu lượng"
54. Bạn truyền thông các thay đổi phá vỡ (breaking changes) tới người dùng API như thế nào?
Thông báo sớm: Cho biết trước ít nhất 6-12 tháng với thay đổi lớn
Dùng header Sunset: Sunset: Sat, 31 Dec 2026 23:59:59 GMT
Cung cấp hướng dẫn di trú: Tài liệu chính xác thay đổi gì và cách thích ứng
Chạy song song hai phiên bản: Giữ phiên bản cũ trong giai đoạn chuyển tiếp
Theo dõi sử dụng: Theo dõi client còn dùng phiên bản cũ
55. Bạn tạo những tài liệu gì cho API?
Tài liệu thiết yếu gồm:
Đặc tả OpenAPI/Swagger: Hợp đồng máy đọc được
Hướng dẫn bắt đầu: Gọi API đầu tiên trong dưới 5 phút
Hướng dẫn xác thực: Cách lấy và dùng thông tin xác thực
Tham chiếu lỗi: Tất cả mã lỗi có thể có và cách xử lý
Changelog: Thay đổi gì ở mỗi phiên bản
Tài liệu giới hạn tốc độ: Giới hạn theo hạng và cách xử lý 429
56. Khi nào bạn KHÔNG dùng REST?
REST không phải lúc nào cũng là lựa chọn đúng. Biết khi nào dùng giải pháp thay thế cho thấy sự trưởng thành về kiến trúc. Tôi đã thấy các nhóm ép REST vào các trường hợp gây rắc rối nhiều hơn là giải quyết vấn đề.
Dùng phần này như tra cứu nhanh khi bạn cần xác minh thuộc tính phương thức HTTP, mã trạng thái hoặc các mẫu phổ biến trong lúc chuẩn bị phỏng vấn hay phát triển thực tế.
So sánh Phương thức HTTP
Bảng này tóm tắt các thuộc tính chính của mỗi phương thức HTTP, giúp bạn chọn đúng cho trường hợp sử dụng.
Phương thức
An toàn
Idempotent
Có thể lưu đệm
Trường hợp điển hình
GET
Có
Có
Có
Truy xuất tài nguyên
POST
Không
Không
Có điều kiện
Tạo tài nguyên
PUT
Không
Có
Không
Thay thế tài nguyên
PATCH
Không
Không
Có điều kiện
Cập nhật một phần
DELETE
Không
Có
Không
Xóa tài nguyên
HEAD
Có
Có
Có
Chỉ lấy header
OPTIONS
Có
Có
Không
CORS preflight
Tham chiếu Mã Trạng thái
Dưới đây là các mã trạng thái HTTP thường dùng nhất, được tổ chức theo nhóm. Tập trung hiểu khi nào dùng mỗi mã thay vì học thuộc toàn bộ đặc tả.
2xx Thành công
200 OK: GET, PUT, PATCH thành công
201 Created: POST thành công (kèm header Location)
204 No Content: DELETE thành công
4xx Lỗi phía khách
400 Bad Request: Cú pháp sai
401 Unauthorized: Cần xác thực
403 Forbidden: Đã xác thực nhưng không có quyền
404 Not Found: Tài nguyên không tồn tại
409 Conflict: Xung đột trạng thái
422 Unprocessable Entity: Lỗi xác thực
429 Too Many Requests: Bị giới hạn tốc độ
5xx Lỗi phía máy chủ
500 Internal Server Error: Lỗi chung phía máy chủ
502 Bad Gateway: Lỗi máy chủ trung gian
503 Service Unavailable: Quá tải tạm thời
Những Sai lầm Phổ biến cần Tránh
Ngay cả lập trình viên giàu kinh nghiệm cũng mắc phải. Hãy chú ý các lỗi thường gặp khi thiết kế hoặc triển khai REST API:
Dùng động từ trong URL (ví dụ, /getUsers thay vì /users)
Trả về 200 OK cho trạng thái lỗi, khiến xử lý lỗi phía client bị hỏng
Nhầm 401 và 403 (Xác thực vs. Phân quyền)
Lồng URL quá sâu quá hai cấp
Lưu token trong localStorage (tạo lỗ hổng XSS)
Bỏ qua idempotency cho yêu cầu POST
Trả về thông điệp lỗi chung chung không có chi tiết khả dụng
Kết luận
Tôi hiểu rằng học thuộc định nghĩa sẽ không đảm bảo bạn vượt qua mọi buổi phỏng vấn kỹ thuật. Thực tế là kỹ thuật ngoài đời thường đòi hỏi phá vỡ các "quy tắc" nghiêm ngặt vừa bàn, và nhà tuyển dụng quan tâm đến lập luận của bạn hơn là khả năng đọc vanh vách đặc tả RFC. Với các vai trò chuyên sâu, kiến thức lĩnh vực hoặc chuyên môn framework cụ thể có thể vẫn là yếu tố quyết định.
Nhưng nắm vững các nền tảng REST vẫn quan trọng dù bạn không gặp đúng các câu hỏi này. Nó là bản thiết kế để hiểu cách web hiện đại vận hành. Khi bạn được yêu cầu thiết kế hệ thống mới hoặc debug sự cố production, hiểu sự khác biệt giữa 401 và 403 (như tôi đã giải thích) giúp bạn giải quyết vấn đề nhanh hơn. Bạn sẽ nhận ra vì sao chuẩn hóa tương tác API, không chỉ viết mã chạy được, là dấu ấn của kỹ sư cấp cao.
Tôi là một kỹ sư dữ liệu và người xây dựng cộng đồng, làm việc với pipeline dữ liệu, đám mây và công cụ AI, đồng thời viết các hướng dẫn thực hành, tác động cao cho DataCamp và các nhà phát triển mới nổi.
Câu hỏi thường gặp
Tôi có nên học thuộc các đặc tả RFC cho phương thức HTTP không?⌄
Tuyệt đối không. Nhà tuyển dụng muốn thấy bạn hiểu hệ quả thực tế, không phải đọc thuộc tài liệu. Hãy tập trung vào lý do vì sao idempotency quan trọng khi một yêu cầu mạng thất bại và cần retry. Đó là điều phân biệt tư duy junior và senior.
Nếu tôi bị hỏi về SOAP hoặc XML-RPC vào năm 2026 thì sao?⌄
Xảy ra thường xuyên hơn bạn nghĩ, nhất là với các vai trò tại ngân hàng, y tế hoặc nhà thầu chính phủ. Mấu chốt là giải thích vì sao các giao thức cũ vẫn tồn tại (hợp đồng nghiêm ngặt, bảo mật cấp thông điệp) thay vì gạt đi là lỗi thời. Hãy thể hiện bạn hiểu các đánh đổi, không chỉ xu hướng.
Làm sao tôi luyện thiết kế API nếu không có dự án thực?⌄
Hãy chọn một dịch vụ bạn dùng hằng ngày (Spotify, Twitter, hệ thống đặt chỗ phòng gym của bạn) và phác thảo cách bạn sẽ thiết kế API của nó. Bạn sẽ tạo những endpoint nào? Bạn sẽ phân trang thế nào cho playlist của người dùng với 10.000 bài hát? Bài tập này sẽ nhanh chóng lộ ra khoảng trống trong hiểu biết của bạn.
Nhà tuyển dụng có thực sự kiểm tra OAuth 2.1 không, hay OAuth 2.0 vẫn chiếm ưu thế?⌄
Đa số công ty vẫn dùng OAuth 2.0, nhưng biết rằng 2.1 bắt buộc PKCE cho mọi client cho thấy bạn cập nhật thực hành bảo mật. Hãy nhắc đến nó như "xu hướng ngành đang hướng tới" thay vì cho rằng ai cũng đã áp dụng.
Điều gì là bẫy lớn nhất khiến đa số ứng viên vấp ngã?⌄
Không đặt câu hỏi làm rõ trong phần thiết kế hệ thống. Khi được yêu cầu "thiết kế một API", ứng viên nhảy ngay vào endpoint mà không hỏi về quy mô, yêu cầu nhất quán, hay đây là nội bộ hay public. Câu trả lời tốt nhất bắt đầu bằng câu hỏi, không phải giải pháp.
Xây dựng API mạnh mẽ, sẵn sàng cho production với FastAPI, thành thạo HTTP operations, validation và async execution để tạo data và ML pipelines hiệu quả.
REST API vận hành phần lớn các tích hợp trên internet. Dù bạn ứng tuyển vai trò backend, full stack hay kỹ sư phần mềm, nhiều khả năng bạn sẽ gặp các câu hỏi về thiết kế REST API, phương thức HTTP và các mẫu xác thực.
Trong hướng dẫn này, tôi sẽ dẫn bạn qua những câu hỏi nhà tuyển dụng thực sự hay hỏi. Tôi đã sắp xếp chúng theo mức độ khó và loại vai trò, để bạn tập trung vào những gì quan trọng nhất cho vị trí mục tiêu. Mỗi câu trả lời đều kèm ví dụ thực tế và, khi phù hợp, các đoạn mã bạn có thể điều chỉnh.
Một điều cần nhớ: nhà tuyển dụng kiểm tra nền tảng cơ bản thường xuyên hơn nhiều so với các chủ đề nâng cao. Nếu bạn nắm chắc những điều căn bản (phương thức HTTP, mã trạng thái, tính vô trạng), bạn sẽ tự tin xử lý hầu hết các buổi phỏng vấn REST API. Những mẫu kiến trúc cầu kỳ sẽ đến sau.
Câu hỏi Phỏng vấn REST API Cơ bản
Những câu hỏi này kiểm tra kiến thức nền tảng của bạn. Hãy kỳ vọng gặp chúng trong hầu như mọi buổi phỏng vấn, bất kể cấp độ thâm niên.
1. REST là gì và các ràng buộc của nó?
REST là viết tắt của Representational State Transfer. Đây là một phong cách kiến trúc để thiết kế các ứng dụng mạng, được Roy Fielding định nghĩa trong luận án tiến sĩ năm 2000.
REST có sáu ràng buộc:
2. Sự khác nhau giữa REST và SOAP là gì?
REST là một phong cách kiến trúc; SOAP là một giao thức. REST thường dùng JSON qua HTTP và tận dụng các phương thức HTTP tiêu chuẩn. SOAP chỉ dùng XML và định nghĩa định dạng thông điệp riêng với phong bì và headers.
Khía cạnh
REST
SOAP
Định dạng
JSON, XML, khác
Chỉ XML
Vận chuyển
HTTP
HTTP, SMTP, khác
Bộ nhớ đệm
Bộ nhớ đệm HTTP gốc
Không thể lưu đệm
Hiệu năng
Nhẹ
Độ trễ cao hơn
SOAP vẫn có ý nghĩa với các hệ thống doanh nghiệp cần hợp đồng chính thức (WSDL) hoặc bảo mật cấp thông điệp (WS-Security).
3. Các phương thức HTTP là gì và dùng khi nào?
Các phương thức HTTP xác định hành động cần thực hiện trên một tài nguồn.
Phương thức
Mục đích
Ví dụ
GETTruy xuất một tài nguyên
GET /users/123POSTTạo tài nguyên mới
POST /usersPUTThay thế toàn bộ tài nguyên
PUT /users/123PATCHCập nhật một phần tài nguyên
PATCH /users/123DELETEXóa một tài nguyên
DELETE /users/1234. Sự khác nhau giữa PUT và POST là gì?
POST tạo một tài nguyên mới, nơi máy chủ quyết định URI. PUT thay thế một tài nguyên tại một URI cụ thể do máy khách chỉ định.
Nếu bạn PUT tới một URI chưa tồn tại, máy chủ có thể tạo mới. Nếu bạn PUT tới một URI đã tồn tại, bạn sẽ thay thế toàn bộ tài nguyên.
5. Sự khác nhau giữa PUT và PATCH là gì?
PUT thay thế toàn bộ tài nguyên. PATCH áp dụng các sửa đổi từng phần.
6. "Stateless" trong REST nghĩa là gì?
Stateless nghĩa là mỗi yêu cầu phải chứa toàn bộ thông tin máy chủ cần để xử lý. Máy chủ không lưu bất kỳ ngữ cảnh khách hàng nào giữa các yêu cầu.
Điều này đồng nghĩa không có session phía máy chủ. Nếu người dùng đã xác thực, máy khách phải gửi thông tin xác thực (thường là token) trong mọi yêu cầu.
7. Điều gì làm cho một API là RESTful?
Một API thực sự RESTful khi thỏa mãn tất cả ràng buộc REST, bao gồm HATEOAS (Hypermedia as the Engine of Application State). Trên thực tế, hầu hết API tự nhận là "REST" thực ra là "giống REST" hoặc ở Mức 2 của Mô hình Trưởng thành Richardson. Và thành thật mà nói, điều đó là ổn cho đa số trường hợp.
Các mức trong Mô hình Trưởng thành Richardson cho REST API. Hình do Tác giả thực hiện.
8. Những mã trạng thái HTTP cơ bản nào bạn nên biết?
Bạn nên quen thuộc với ít nhất bảy mã trạng thái thiết yếu này, bao quát phần lớn tình huống API:
Mã
Tên
Khi sử dụng
200
OK
GET, PUT, PATCH thành công
201
Created
POST thành công (kèm header Location)
204
No Content
DELETE thành công
400
Bad Request
Cú pháp sai
404
Not Found
Tài nguyên không tồn tại
500
Internal Server Error
Lỗi phía máy chủ
9. Sự khác nhau giữa tài nguyên và endpoint là gì?
Tài nguyên là thực thể dữ liệu (người dùng, đơn hàng, sản phẩm). Endpoint là đường dẫn URL cung cấp quyền truy cập tới tài nguyên đó.
10. Thực hành tốt cho thiết kế URI là gì?
Dùng danh từ, không dùng động từ. Để URI viết thường với dấu gạch nối cho tên nhiều từ. Dùng danh từ số nhiều cho tập hợp.
Tránh lồng quá sâu. Thay vì
/users/123/posts/456/comments/789, hãy cân nhắc/comments/789hoặc/comments?post_id=456.11. Tính idempotent là gì và những phương thức HTTP nào là idempotent?
Một thao tác là idempotent nếu thực hiện nhiều lần cho ra kết quả giống như thực hiện một lần.
Phương thức
Idempotent
Lý do
GETCó
Đọc không thay đổi trạng thái
PUTCó
Thay thế bằng cùng dữ liệu cho ra cùng kết quả
DELETECó
Xóa hai lần vẫn là đã bị xóa
POSTKhông
Tạo hai lần tạo hai tài nguyên
PATCHKhông*
Phụ thuộc vào thao tác
Một PATCH đặt một giá trị là idempotent; một PATCH tăng bộ đếm thì không.
12. Sự khác nhau giữa phương thức an toàn (safe) và idempotent?
Phương thức an toàn không sửa đổi tài nguyên (GET, HEAD, OPTIONS). Phương thức idempotent có thể gọi nhiều lần với cùng hiệu ứng (GET, PUT, DELETE).
Tất cả phương thức an toàn đều idempotent, nhưng không phải mọi phương thức idempotent đều an toàn. DELETE là idempotent nhưng không an toàn vì nó sửa đổi trạng thái.
13. Khi nào dùng tham số truy vấn so với tham số đường dẫn?
Tham số đường dẫn định danh một tài nguyên cụ thể. Tham số truy vấn lọc, sắp xếp hoặc phân trang tập hợp.
14. Đàm phán nội dung (content negotiation) là gì?
Đàm phán nội dung cho phép máy khách yêu cầu các biểu diễn khác nhau của một tài nguyên. Máy khách gửi header
Accept, và máy chủ phản hồi với định dạng phù hợp.15. Mục đích của phương thức OPTIONS là gì?
OPTIONS trả về các phương thức HTTP mà máy chủ hỗ trợ cho một URL cụ thể. Trình duyệt dùng nó cho yêu cầu thăm dò CORS để kiểm tra có cho phép yêu cầu cross-origin hay không.
Câu hỏi Phỏng vấn REST API Trung cấp
Những câu hỏi này kiểm tra khả năng ứng dụng thực tế và ra quyết định. Hãy kỳ vọng cho vị trí tầm trung.
16. Sự khác nhau giữa 401 và 403?
Đây là cặp mã trạng thái hay bị nhầm nhất. Tôi đã thấy cả kỹ sư cao cấp cũng lẫn lộn trong các buổi review mã.
401 Unauthorized
Nghĩa là chưa xác thực. Máy chủ không biết bạn là ai. Phản hồi của bạn nên nhắc người dùng đăng nhập.
403 Forbidden
Nghĩa là không được phép. Máy chủ biết bạn là ai nhưng bạn thiếu quyền. Xác thực lại cũng không giúp gì.
Lưu đồ quyết định lỗi xác thực so với phân quyền. Hình do Tác giả thực hiện.
17. Sự khác nhau giữa 400 và 422?
Dưới đây là ví dụ minh họa sự khác biệt:
400 Bad Request
Chỉ ra cú pháp sai. Máy chủ không thể phân tích yêu cầu (cấu trúc JSON không hợp lệ, thiếu header bắt buộc).
422 Unprocessable Entity
Chỉ ra cú pháp hợp lệ nhưng lỗi ngữ nghĩa. JSON hợp lệ nhưng dữ liệu không qua xác thực (định dạng email sai, mật khẩu quá ngắn).
18. Khi nào dùng 409 Conflict?
Dùng 409 khi yêu cầu xung đột với trạng thái hiện tại của tài nguyên:
19. Bạn triển khai phân trang thế nào?
Hai cách tiếp cận chính:
Phân trang dựa trên offset
Đơn giản nhưng gặp vấn đề hiệu năng với tập dữ liệu lớn.
Phân trang dựa trên cursor
Mở rộng tốt hơn và tránh "trôi trang" khi dữ liệu thay đổi.
Các công ty như Stripe, GitHub và Slack dùng phân trang theo cursor cho tập dữ liệu lớn.
20. Các chiến lược quản lý phiên bản API phổ biến?
Có ba cách tiếp cận chính, mỗi cách có đánh đổi khác nhau:
Phiên bản trong URI
Phổ biến nhất. Rõ ràng và dễ debug.
Phiên bản qua header
URL gọn hơn nhưng khó thử trong trình duyệt.
Phiên bản qua tham số truy vấn
Dễ thêm nhưng làm URL lộn xộn.
21. ETag là gì và bộ nhớ đệm hoạt động thế nào?
ETag là định danh phiên bản cho một tài nguyên. Máy chủ gửi nó trong phản hồi; máy khách gửi lại trong các yêu cầu sau để kiểm tra tài nguyên có thay đổi không.
22. Những phương thức xác thực nào dùng cho REST API?
Bốn phương thức xác thực phổ biến là API Key, Bearer Token, OAuth 2.0 và JWT:
Phương thức
Trường hợp sử dụng
Ưu điểm
Nhược điểm
API Keys
Máy chủ - máy chủ
Đơn giản
Không hết hạn, dễ lộ
Bearer Tokens
Xác thực phiên
Vô trạng
Phải bảo mật lưu trữ
OAuth 2.0
Truy cập bên thứ ba
Ủy quyền
Triển khai phức tạp
JWT
Xác thực vô trạng
Tự chứa
Không thể thu hồi nếu không có blacklist
23. JWT là gì và hoạt động ra sao?
JWT (JSON Web Token) gồm ba phần: Header, Payload và Signature. Tìm hiểu thêm về làm việc với JSON trong Python.
Máy chủ ký token; máy khách gửi kèm trong yêu cầu. Máy chủ xác thực chữ ký mà không cần tra cứu cơ sở dữ liệu.
24. Sự khác nhau giữa RS256 và HS256?
HS256 (đối xứng): Cùng một bí mật dùng để ký và xác minh. Rủi ro nếu nhiều dịch vụ cần xác minh token.
RS256 (bất đối xứng): Khóa riêng ký, khóa công khai xác minh. Khuyến nghị cho hệ thống phân tán nơi nhiều dịch vụ xác thực token.
25. HATEOAS là gì?
HATEOAS (Hypermedia as the Engine of Application State) nghĩa là phản hồi bao gồm các liên kết tới hành động và tài nguyên liên quan.
Trên thực tế, đa số API không triển khai đầy đủ HATEOAS. Hãy biết khái niệm này nhưng đừng kỳ vọng phải triển khai trong hầu hết công việc. Ngay cả các công ty công nghệ lớn cũng hiếm khi xây dựng API tuân thủ HATEOAS hoàn toàn.
26. Bạn xử lý lỗi nhất quán như thế nào?
Dùng định dạng RFC 7807 Problem Details cho phản hồi lỗi nhất quán:
27. Hạn chế tốc độ (rate limiting) là gì và vì sao quan trọng?
Rate limiting bảo vệ API khỏi lạm dụng và đảm bảo sử dụng công bằng. Phản hồi phổ biến:
28. Bạn thiết kế lọc và sắp xếp thế nào?
Dùng tham số truy vấn với quy ước rõ ràng:
Câu hỏi Phỏng vấn REST API Nâng cao
Những câu hỏi này kiểm tra tư duy kiến trúc. Hãy kỳ vọng cho vị trí cấp cao.
29. Có gì thay đổi giữa OAuth 2.0 và OAuth 2.1?
OAuth 2.1 hợp nhất các thực hành bảo mật tốt nhất:
Tính năng
OAuth 2.0
OAuth 2.1
PKCE
Tùy chọn
Bắt buộc cho TẤT CẢ client
Implicit Grant
Hỗ trợ
Loại bỏ
Password Grant
Hỗ trợ
Loại bỏ
Redirect URI
Khớp linh hoạt
Yêu cầu khớp chính xác
Điểm mấu chốt: dùng luồng Authorization Code với PKCE cho mọi loại client.
30. Bạn triển khai idempotency cho endpoint thanh toán thế nào?
Dùng idempotency key để khiến yêu cầu POST an toàn khi retry:
Máy khách tạo một UUID và gửi kèm theo yêu cầu. Nếu cùng key đến lần nữa, trả về phản hồi đã lưu.
31. Bạn thiết kế rate limiter phân tán như thế nào?
Với hệ thống phân tán, bạn không thể dùng bộ đếm trong bộ nhớ vì lưu lượng được cân bằng qua nhiều instance. Đây là cạm bẫy thường làm ứng viên vấp ngã.
Kiến trúc:
32. Khi nào bạn chọn gRPC thay vì REST?
Lựa chọn giữa gRPC và REST phụ thuộc vào yêu cầu cụ thể của bạn.
Chọn gRPC khi:
Chọn REST khi:
33. Bạn xử lý tác vụ chạy lâu như thế nào?
Dùng mẫu yêu cầu bất đồng bộ:
Máy khách gửi yêu cầu
Máy chủ trả về
202 Acceptedkèm URL trạng tháiMáy khách thăm dò URL trạng thái đến khi hoàn tất
34. Mẫu (pattern) Saga là gì?
Saga xử lý giao dịch phân tán trên nhiều microservice mà không cần khóa. Mỗi dịch vụ thực hiện một giao dịch cục bộ và phát sự kiện. Nếu một bước thất bại, các giao dịch bù hoàn tác các bước trước.
35. Các lỗ hổng bảo mật JWT phổ biến?
Nhầm lẫn thuật toán: Kẻ tấn công đổi RS256 sang HS256 và ký bằng khóa công khai. Cách khắc phục: luôn whitelist thuật toán.
Thuật toán "none": Kẻ tấn công loại bỏ hoàn toàn chữ ký. Cách khắc phục: từ chối thuật toán "none".
Câu hỏi REST API cho Lập trình viên Backend
Những câu hỏi này tập trung vào chi tiết triển khai phía máy chủ, tối ưu cơ sở dữ liệu và các mẫu hiệu năng mà kỹ sư backend gặp hàng ngày.
36. Vấn đề truy vấn N+1 là gì?
Vấn đề N+1 xảy ra khi bạn lấy N bản ghi rồi thực hiện một truy vấn riêng cho từng quan hệ của mỗi bản ghi.
Giải pháp:
Django: Dùng
select_related()cho khóa ngoại,prefetch_related()cho quan hệ nhiều-nhiều.SQLAlchemy: Dùng
joinedload()hoặcselectinload().37. Bạn cấu hình connection pooling như thế nào?
Connection pooling tái sử dụng kết nối cơ sở dữ liệu thay vì tạo mới cho mỗi yêu cầu.
38. Bạn biết những chiến lược lưu đệm nào?
Có ba chiến lược lưu đệm chính, mỗi chiến lược tối ưu cho kiểu truy cập khác nhau:
Chiến lược
Mô tả
Trường hợp dùng
Cache-Aside
Ứng dụng kiểm tra cache, rồi DB
Đọc nhiều, chấp nhận lỗi thời
Write-Through
Ghi vào cache và DB cùng lúc
Yêu cầu nhất quán
Write-Behind
Ghi vào cache, cập nhật DB bất đồng bộ
Thông lượng ghi cao
39. Bạn triển khai xác minh chữ ký webhook như thế nào?
Xác minh chữ ký webhook đảm bảo yêu cầu thực sự đến từ người gửi mong đợi. Đây là triển khai dùng HMAC:
40. Những chỉ số nào cho thấy sức khỏe API?
Bạn nên giám sát bốn chỉ số then chốt này để đánh giá sức khỏe API:
Chỉ số
Mô tả
Ngưỡng cảnh báo
Độ trễ P50
Thời gian phản hồi trung vị
Đường cơ sở
Độ trễ P99
Chậm nhất 1%
> 2s trong 5 phút
Tỷ lệ lỗi
% 4xx/5xx
> 1% trong 5 phút
Thông lượng
Số yêu cầu mỗi giây
Lập kế hoạch năng lực
Câu hỏi REST API cho Lập trình viên Full Stack
Những câu hỏi này kiểm tra hiểu biết của bạn về cả phía máy khách và máy chủ, đặc biệt là bảo mật trình duyệt, quản lý trạng thái và giao tiếp cross-origin.
41. Khi nào trình duyệt gửi yêu cầu thăm dò CORS?
Trình duyệt gửi OPTIONS preflight khi:
42. Bạn cấu hình CORS an toàn như thế nào?
Cấu hình CORS an toàn yêu cầu whitelist rõ ràng nguồn (origin) và xử lý cẩn thận thông tin xác thực. Đây là thiết lập Express.js an toàn:
Không bao giờ dùng wildcard (
*) với thông tin xác thực. Không bao giờ cho phépnullorigin.43. Bạn nên lưu token ở đâu trên máy khách?
Lưu trữ token liên quan đến đánh đổi bảo mật giữa lỗ hổng XSS và CSRF"
Lưu trữ
Rủi ro XSS
Rủi ro CSRF
Khuyến nghị
localStorage
Cao
Không
Tránh dùng cho token
HttpOnly Cookie
Thấp
Cần giảm thiểu
Khuyến nghị
In-memory
Thấp
Thấp
Tốt nhất cho access token
Thực hành tốt nhất: Lưu refresh token trong cookie HttpOnly với
SameSite=Strict. Giữ access token trong bộ nhớ.44. Khi nào dùng WebSockets so với SSE?
Lựa chọn phụ thuộc vào việc bạn có cần giao tiếp hai chiều hay không và cách bạn muốn xử lý kết nối lại:
Tính năng
WebSockets
SSE
Hướng
Hai chiều
Từ máy chủ đến máy khách
Kết nối lại
Thủ công
Tự động
Dữ liệu nhị phân
Có
Không
Dùng SSE cho thông báo, luồng trực tiếp, bảng giá cổ phiếu. Dùng WebSockets cho chat, game nhiều người, soạn thảo cộng tác.
45. Bạn xử lý tải lên tệp như thế nào?
Với tệp lớn, dùng tải lên theo khối (chunk) kèm theo theo dõi tiến độ:
Câu hỏi REST API theo Kịch bản
Những câu hỏi này đánh giá khả năng áp dụng nguyên tắc REST vào bài toán thực tế. Nhà tuyển dụng muốn thấy quy trình thiết kế và cách bạn đưa ra đánh đổi kiến trúc.
46. Thiết kế REST API cho hệ thống đặt phòng khách sạn
Một hệ thống đặt phòng khách sạn cần xử lý tìm kiếm, kiểm tra tình trạng phòng và đặt chỗ, đồng thời ngăn đặt trùng. Dưới đây là các tài nguyên cốt lõi:
Tài nguyên:
/hotels- Liệt kê và tìm kiếm khách sạn/hotels/{id}/rooms- Phòng còn trống/bookings- Tạo và quản lý đặt chỗ/guests/{id}- Hồ sơ kháchQuyết định chính:
47. Bạn sẽ triển khai xóa mềm (soft delete) như thế nào?
Thêm timestamp
deleted_atthay vì xóa bản ghi:48. Bạn di trú từ v1 sang v2 mà không làm hỏng client như thế nào?
Dùng mẫu Cây Đa Bóp Nghẹt (Strangler Fig):
49. Bạn thiết kế API tìm kiếm với lọc phức tạp như thế nào?
Với tìm kiếm sản phẩm có nhiều bộ lọc:
Quyết định thiết kế:
50. Bạn xử lý quản lý phiên bản API trong kiến trúc microservices như thế nào?
Tùy chọn:
Phiên bản ở cấp gateway: API gateway định tuyến
/v1/*tới dịch vụ cũ,/v2/*tới dịch vụ mớiPhiên bản ở cấp dịch vụ: Mỗi dịch vụ tự xử lý thương lượng phiên bản
Hợp đồng do bên tiêu thụ chi phối: Dùng Pact hoặc công cụ tương tự để đảm bảo tương thích
Với đa số nhóm, phiên bản ở cấp gateway mang lại sự tách biệt gọn gàng nhất.
51. Bạn sẽ triển khai rate limiting cho các hạng người dùng khác nhau như thế nào?
Giải pháp gồm định nghĩa giới hạn theo hạng và kiểm tra bằng bộ đếm Redis:
Câu hỏi Hành vi về REST API
Những câu hỏi này đánh giá kỹ năng giao tiếp và cách bạn xử lý thách thức API thực tế. Hãy tập trung thể hiện quy trình giải quyết vấn đề và cách bạn làm việc với các bên liên quan.
52. Giải thích REST cho người không kỹ thuật
"Hãy nghĩ REST API như một người bồi bàn trong nhà hàng. Bạn (khách) không thể vào bếp trực tiếp. Thay vào đó, bạn nói với bồi bàn bạn muốn gì từ thực đơn, và họ mang đến cho bạn. Thực đơn giống như tài liệu API, liệt kê những gì bạn có thể gọi. Bồi bàn theo quy tắc cụ thể: bạn yêu cầu món (GET), bạn đặt món mới (POST), hoặc bạn trả lại món (DELETE). Nếu bếp hết món gì đó, bồi bàn sẽ báo bạn (404 Not Found) để bạn không chờ vô ích."
Phép so sánh này hoạt động đáng ngạc nhiên trong các buổi họp với stakeholder.
53. Mô tả một lần bạn tối ưu một API
Dùng phương pháp STAR:
54. Bạn truyền thông các thay đổi phá vỡ (breaking changes) tới người dùng API như thế nào?
Thông báo sớm: Cho biết trước ít nhất 6-12 tháng với thay đổi lớn
Dùng header Sunset:
Sunset: Sat, 31 Dec 2026 23:59:59 GMTCung cấp hướng dẫn di trú: Tài liệu chính xác thay đổi gì và cách thích ứng
Chạy song song hai phiên bản: Giữ phiên bản cũ trong giai đoạn chuyển tiếp
Theo dõi sử dụng: Theo dõi client còn dùng phiên bản cũ
55. Bạn tạo những tài liệu gì cho API?
Tài liệu thiết yếu gồm:
56. Khi nào bạn KHÔNG dùng REST?
REST không phải lúc nào cũng là lựa chọn đúng. Biết khi nào dùng giải pháp thay thế cho thấy sự trưởng thành về kiến trúc. Tôi đã thấy các nhóm ép REST vào các trường hợp gây rắc rối nhiều hơn là giải quyết vấn đề.
Kịch bản
Giải pháp thay thế tốt hơn
Chat hoặc game thời gian thực
WebSockets
Dịch vụ nội bộ hiệu năng cao
gRPC
Truy vấn dữ liệu lồng phức tạp
GraphQL
Kiến trúc hướng sự kiện
Message broker (Kafka, RabbitMQ)
Streaming hai chiều
gRPC bidirectional hoặc WebSockets
Tham Khảo Nhanh REST API
Dùng phần này như tra cứu nhanh khi bạn cần xác minh thuộc tính phương thức HTTP, mã trạng thái hoặc các mẫu phổ biến trong lúc chuẩn bị phỏng vấn hay phát triển thực tế.
So sánh Phương thức HTTP
Bảng này tóm tắt các thuộc tính chính của mỗi phương thức HTTP, giúp bạn chọn đúng cho trường hợp sử dụng.
Phương thức
An toàn
Idempotent
Có thể lưu đệm
Trường hợp điển hình
GET
Có
Có
Có
Truy xuất tài nguyên
POST
Không
Không
Có điều kiện
Tạo tài nguyên
PUT
Không
Có
Không
Thay thế tài nguyên
PATCH
Không
Không
Có điều kiện
Cập nhật một phần
DELETE
Không
Có
Không
Xóa tài nguyên
HEAD
Có
Có
Có
Chỉ lấy header
OPTIONS
Có
Có
Không
CORS preflight
Tham chiếu Mã Trạng thái
Dưới đây là các mã trạng thái HTTP thường dùng nhất, được tổ chức theo nhóm. Tập trung hiểu khi nào dùng mỗi mã thay vì học thuộc toàn bộ đặc tả.
2xx Thành công
4xx Lỗi phía khách
5xx Lỗi phía máy chủ
Những Sai lầm Phổ biến cần Tránh
Ngay cả lập trình viên giàu kinh nghiệm cũng mắc phải. Hãy chú ý các lỗi thường gặp khi thiết kế hoặc triển khai REST API:
Dùng động từ trong URL (ví dụ,
/getUsersthay vì/users)Trả về 200 OK cho trạng thái lỗi, khiến xử lý lỗi phía client bị hỏng
Nhầm 401 và 403 (Xác thực vs. Phân quyền)
Lồng URL quá sâu quá hai cấp
Lưu token trong localStorage (tạo lỗ hổng XSS)
Bỏ qua idempotency cho yêu cầu POST
Trả về thông điệp lỗi chung chung không có chi tiết khả dụng
Kết luận
Tôi hiểu rằng học thuộc định nghĩa sẽ không đảm bảo bạn vượt qua mọi buổi phỏng vấn kỹ thuật. Thực tế là kỹ thuật ngoài đời thường đòi hỏi phá vỡ các "quy tắc" nghiêm ngặt vừa bàn, và nhà tuyển dụng quan tâm đến lập luận của bạn hơn là khả năng đọc vanh vách đặc tả RFC. Với các vai trò chuyên sâu, kiến thức lĩnh vực hoặc chuyên môn framework cụ thể có thể vẫn là yếu tố quyết định.
Nhưng nắm vững các nền tảng REST vẫn quan trọng dù bạn không gặp đúng các câu hỏi này. Nó là bản thiết kế để hiểu cách web hiện đại vận hành. Khi bạn được yêu cầu thiết kế hệ thống mới hoặc debug sự cố production, hiểu sự khác biệt giữa 401 và 403 (như tôi đã giải thích) giúp bạn giải quyết vấn đề nhanh hơn. Bạn sẽ nhận ra vì sao chuẩn hóa tương tác API, không chỉ viết mã chạy được, là dấu ấn của kỹ sư cấp cao.
Nếu bạn muốn đào sâu vào xây dựng các hệ thống này, hãy xem khóa học Giới thiệu về API trong Python của chúng tôi.