Bỏ qua để đến nội dung
Knowledge Hub

Ghép cặp: chọn HTTP status code cho từng tình huống API Trung cấp

Thời gian đọc ước tính: 1 phút

Status code là một hợp đồng: SDK, cơ chế retry, cache và dashboard hành động theo nó trước khi ai đọc tới body. Kéo một code vào từng request.

  • Mỗi giải thích trích nghĩa từ RFC 9110, RFC 6585 (429) hoặc Internet-Draft Idempotency-Key, nên đáp án là theo spec, không theo quy ước của một team.
  • Các cặp hay nhầm nhất: 401 với 403, 403 với 404, 409 với 412, 400 với 422 và 429 với 503.
Ghép cặp

API nên trả HTTP status code nào?

Chín request tới API của một shop online (/orders, /products, /exports). Kéo status code khớp nhất với chuyện đã xảy ra. Có một thẻ không dùng tới.

Mẹo: hỏi trước lỗi của ai (client 4xx hay server 5xx), rồi client phải đổi gì trước khi thử lại.

Chạm Chọn đáp án ở từng tình huống. Trên máy tính có thể kéo thẻ bên dưới thả vào tình huống.

Đã giải 0/9 · sai 0 lần

1Mobile app gửi POST /orders và body bị cắt giữa chừng: JSON parser lỗi ở vị trí 27.

Content-Type: application/json

{"sku": "SHOE-42", "qty": 

2GET /orders tới với bearer access token đã hết hạn 2 phút. Refresh token vẫn còn hạn.

Authorization: Bearer eyJhbGciOi... (exp: 10:02, now: 10:04)

3User 7 đăng nhập hợp lệ và gọi GET /orders/9001. Order 9001 có tồn tại nhưng thuộc user 12. Order ID tăng dần nên dễ đoán.

4Một admin sửa giá sản phẩm, gửi PUT /products/42 kèm ETag đọc từ 5 phút trước. Admin khác đã lưu thay đổi trong lúc đó; ETag hiện tại là "v8".

PUT /products/42
If-Match: "v7"

5App retry POST /orders với cùng Idempotency-Key của một đơn đã xong, nhưng body giờ là qty: 2 thay vì qty: 1.

Idempotency-Key: "6f1c2a8e-3d5b-4c7a-9e0f-1a2b3c4d5e6f"
{"sku": "SHOE-42", "qty": 2}

6Một retry của POST /orders với cùng key và cùng body tới khi request đầu vẫn đang chờ payment gateway.

idempotency_keys: (user 7, POST /orders, K2) status = in_progress

7Một script đồng bộ gọi GET /products 3.000 lần/phút; gói dịch vụ cho 600. Token bucket của API key này trống trong 20 giây tới.

8POST /orders không chạy được: database tồn kho đang bảo trì theo lịch 10 phút. Bản thân API vẫn khoẻ.

9POST /exports yêu cầu file CSV 2 triệu đơn. Tạo file mất khoảng 3 phút, nên một worker làm ở background.

HTTP/1.1 ???
Location: /exports/77
{"status": "queued"}

Body lỗi đi kèm các code này: đọc Lỗi API theo RFC 9457. Với 409 và 422 khi retry POST: đọc Idempotency-Key.