RFC 9457 là gì và API nên trả về lỗi như thế nào?

Ashley Innocent

Ashley Innocent

13 tháng 3 2026

RFC 9457 là gì và API nên trả về lỗi như thế nào?

Apidog cho doanh nghiệp

Triển khai tại chỗ

SSO & RBAC

Tuân thủ SOC 2

Khám phá Apidog Enterprise

TL;DR

RFC 9457 (Thông tin chi tiết lỗi cho API HTTP) là định dạng chuẩn cho các phản hồi lỗi của API. Nó thay thế các định dạng lỗi tùy chỉnh bằng một cấu trúc nhất quán: loại, tiêu đề, trạng thái, chi tiết và thể hiện. Modern PetstoreAPI triển khai RFC 9457 trên tất cả các phản hồi lỗi với thỏa thuận nội dung và chi tiết xác thực phù hợp.

Giới thiệu

API của bạn trả về một lỗi. Phản hồi trông như thế nào? Nếu bạn giống như hầu hết các API, bạn đã tự tạo định dạng riêng cho mình:

{"error": "Invalid email"}
{"message": "Not found", "code": 404}
{"success": false, "errors": ["Email required"]}

Mỗi API có một định dạng lỗi khác nhau. Các client cần xử lý lỗi tùy chỉnh cho từng API. Không có cách chuẩn để phân tích cú pháp lỗi, hiển thị chúng cho người dùng hoặc ghi nhật ký để gỡ lỗi.

RFC 9457 giải quyết vấn đề này. Đây là một tiêu chuẩn của IETF định nghĩa cách các API nên trả về lỗi. Thay vì tự tạo định dạng riêng, bạn sử dụng một tiêu chuẩn đã được chứng minh mà các client đã hiểu.

Swagger Petstore cũ đã sử dụng các định dạng lỗi tùy chỉnh không có sự nhất quán. Modern PetstoreAPI triển khai RFC 9457 trên tất cả các phản hồi lỗi, cung cấp chi tiết lỗi có cấu trúc, có thể đọc được bằng máy.

💡
Nếu bạn đang xây dựng hoặc thử nghiệm các API REST, Apidog giúp bạn xác thực các phản hồi lỗi, kiểm tra sự tuân thủ RFC 9457 và đảm bảo API của bạn trả về cấu trúc lỗi phù hợp. Bạn có thể định nghĩa các định dạng lỗi mong đợi, chạy các thử nghiệm tự động và phát hiện các phản hồi không chính xác.
nút

Trong hướng dẫn này, bạn sẽ tìm hiểu RFC 9457 là gì, cách triển khai nó một cách chính xác và cách Modern PetstoreAPI sử dụng nó cho tất cả các phản hồi lỗi.

Vấn đề lỗi API

Trước RFC 9457, mỗi API đều tự tạo định dạng lỗi riêng cho mình.

Các biến thể định dạng lỗi phổ biến

Định dạng 1: Thông báo đơn giản

{"error": "User not found"}

Định dạng 2: Mã và thông báo

{"code": "USER_NOT_FOUND", "message": "User not found"}

Định dạng 3: Cấu trúc lồng nhau

{
  "success": false,
  "error": {
    "type": "NotFound",
    "message": "User not found"
  }
}

Định dạng 4: Mảng lỗi

{
  "errors": [
    {"field": "email", "message": "Invalid email"}
  ]
}

Các vấn đề với định dạng tùy chỉnh

1. Không nhất quán: Các client cần phân tích cú pháp tùy chỉnh cho mỗi API.

2. Thiếu thông tin: Một số định dạng thiếu mã lỗi, một số thiếu chi tiết, một số thiếu cả hai.

3. Không có cấu trúc đọc được bằng máy: Khó xử lý lỗi bằng lập trình.

4. Quốc tế hóa kém: Thông báo lỗi được mã hóa cứng bằng tiếng Anh.

5. Không có tiêu chuẩn cho lỗi xác thực: Mỗi API xử lý lỗi cấp trường khác nhau.

RFC 9457 là gì?

RFC 9457 (được xuất bản tháng 7 năm 2023) định nghĩa “Thông tin chi tiết lỗi cho API HTTP”. Đây là một tiêu chuẩn IETF chỉ định cách các API nên cấu trúc phản hồi lỗi.

Các tính năng chính

Kiểu phương tiện tiêu chuẩn: application/problem+json (hoặc application/problem+xml)

Cấu trúc nhất quán: Tất cả các lỗi đều theo cùng một định dạng

Có thể đọc được bằng máy: Các client có thể phân tích cú pháp lỗi bằng lập trình

Có thể mở rộng: Bạn có thể thêm các trường tùy chỉnh trong khi vẫn duy trì khả năng tương thích

Nhận biết HTTP: Tích hợp với mã trạng thái HTTP

RFC 9457 so với lỗi tùy chỉnh

Lỗi tùy chỉnh:

{"error": "Email is required"}

Lỗi RFC 9457:

{
  "type": "https://petstoreapi.com/errors/validation-error",
  "title": "Validation Error",
  "status": 400,
  "detail": "The request contains invalid data",
  "instance": "/pets",
  "errors": [
    {
      "field": "email",
      "message": "Email is required"
    }
  ]
}

Phiên bản RFC 9457 cung cấp:

Giải thích cấu trúc RFC 9457

RFC 9457 định nghĩa năm trường tiêu chuẩn và cho phép mở rộng tùy chỉnh.

Các trường tiêu chuẩn

1. type (chuỗi, bắt buộc)

Một tham chiếu URI xác định loại lỗi. Nên trỏ đến tài liệu dễ đọc.

"type": "https://petstoreapi.com/errors/validation-error"

Nếu bỏ qua, mặc định là about:blank.

2. title (chuỗi, bắt buộc)

Một tóm tắt ngắn gọn, dễ đọc về loại lỗi. Không nên thay đổi giữa các lần xuất hiện.

"title": "Validation Error"

3. status (số, bắt buộc)

Mã trạng thái HTTP. Bao gồm để tiện lợi để các client không cần phân tích cú pháp tiêu đề.

"status": 400

4. detail (chuỗi, tùy chọn)

Một giải thích dễ đọc cụ thể cho lần xuất hiện lỗi này.

"detail": "The email field must be a valid email address"

5. instance (chuỗi, tùy chọn)

Một tham chiếu URI xác định lần xuất hiện cụ thể của lỗi. Thường là đường dẫn yêu cầu.

"instance": "/pets/019b4132-70aa-764f-b315-e2803d882a24"

Các phần mở rộng tùy chỉnh

Bạn có thể thêm các trường tùy chỉnh để cung cấp thêm ngữ cảnh:

{
  "type": "https://petstoreapi.com/errors/rate-limit-exceeded",
  "title": "Rate Limit Exceeded",
  "status": 429,
  "detail": "You have exceeded the rate limit of 100 requests per minute",
  "instance": "/pets",
  "retryAfter": 42,
  "limit": 100,
  "remaining": 0,
  "resetAt": "2026-03-13T10:30:00Z"
}

Cách Modern PetstoreAPI triển khai RFC 9457

Modern PetstoreAPI sử dụng RFC 9457 cho tất cả các phản hồi lỗi.

Ví dụ 1: Không tìm thấy tài nguyên

GET /pets/invalid-id
404 Not Found
Content-Type: application/problem+json

{
  "type": "https://docs.petstoreapi.com/errors/not-found",
  "title": "Resource Not Found",
  "status": 404,
  "detail": "The requested pet does not exist",
  "instance": "/pets/invalid-id"
}

Ví dụ 2: Lỗi xác thực

GET /pets
401 Unauthorized
Content-Type: application/problem+json

{
  "type": "https://docs.petstoreapi.com/errors/unauthorized",
  "title": "Authentication Required",
  "status": 401,
  "detail": "Valid authentication credentials are required to access this resource",
  "instance": "/pets"
}

Ví dụ 3: Vượt quá giới hạn tỷ lệ

GET /pets
429 Too Many Requests
Content-Type: application/problem+json
Retry-After: 60

{
  "type": "https://docs.petstoreapi.com/errors/rate-limit-exceeded",
  "title": "Rate Limit Exceeded",
  "status": 429,
  "detail": "You have exceeded the rate limit of 100 requests per minute",
  "instance": "/pets",
  "limit": 100,
  "remaining": 0,
  "resetAt": "2026-03-13T10:31:00Z"
}

Xem tài liệu xử lý lỗi của Modern PetstoreAPI để biết tất cả các loại lỗi.

Lỗi xác thực với RFC 9457

Lỗi xác thực cần chi tiết cấp trường. RFC 9457 cho phép các phần mở rộng tùy chỉnh cho điều này.

Định dạng xác thực của Modern PetstoreAPI

POST /pets
400 Bad Request
Content-Type: application/problem+json

{
  "type": "https://docs.petstoreapi.com/errors/validation-error",
  "title": "Validation Error",
  "status": 400,
  "detail": "The request contains 2 validation errors",
  "instance": "/pets",
  "errors": [
    {
      "field": "name",
      "message": "Name is required",
      "code": "REQUIRED_FIELD"
    },
    {
      "field": "species",
      "message": "Species must be one of: DOG, CAT, BIRD, FISH, REPTILE, OTHER",
      "code": "INVALID_ENUM_VALUE",
      "rejectedValue": "DRAGON"
    }
  ]
}

Các điểm chính

mảng errors: Chứa chi tiết xác thực cấp trường

field: Đường dẫn JSON đến trường không hợp lệ

message: Thông báo lỗi dễ đọc

code: Mã lỗi có thể đọc được bằng máy

rejectedValue: Giá trị bị từ chối (tùy chọn)

Định dạng này cho phép các client:

Kiểm thử phản hồi lỗi với Apidog

Apidog giúp bạn kiểm tra sự tuân thủ RFC 9457.

Trường hợp kiểm thử: Lỗi xác thực

// Apidog test script
pm.test("Returns RFC 9457 error format", () => {
  const response = pm.response.json();

  // Check required fields
  pm.expect(response).to.have.property("type");
  pm.expect(response).to.have.property("title");
  pm.expect(response).to.have.property("status");

  // Check status matches HTTP status
  pm.expect(response.status).to.equal(pm.response.code);

  // Check content type
  pm.expect(pm.response.headers.get("Content-Type"))
    .to.include("application/problem+json");
});

pm.test("Validation errors include field details", () => {
  const response = pm.response.json();

  pm.expect(response).to.have.property("errors");
  pm.expect(response.errors).to.be.an("array");

  response.errors.forEach(error => {
    pm.expect(error).to.have.property("field");
    pm.expect(error).to.have.property("message");
  });
});

Trường hợp kiểm thử: URL loại lỗi

pm.test("Error type URL is accessible", async () => {
  const response = pm.response.json();
  const typeUrl = response.type;

  // Verify type URL returns documentation
  const docResponse = await pm.sendRequest(typeUrl);
  pm.expect(docResponse.code).to.equal(200);
});

Chuyển đổi từ định dạng lỗi tùy chỉnh

Nếu bạn đang sử dụng các định dạng lỗi tùy chỉnh, đây là cách để chuyển đổi sang RFC 9457.

Bước 1: Thêm tiêu đề Content-Type

Bắt đầu trả về application/problem+json:

Content-Type: application/problem+json

Bước 2: Ánh xạ các trường hiện có

Ánh xạ định dạng tùy chỉnh của bạn sang RFC 9457:

Trước đây:

{
  "error": "USER_NOT_FOUND",
  "message": "User not found"
}

Sau đây:

{
  "type": "https://api.example.com/errors/user-not-found",
  "title": "User Not Found",
  "status": 404,
  "detail": "User not found"
}

Bước 3: Hỗ trợ cả hai định dạng (Giai đoạn chuyển tiếp)

Sử dụng thương lượng nội dung để hỗ trợ cả hai định dạng:

Accept: application/json → Returns custom format
Accept: application/problem+json → Returns RFC 9457 format

Bước 4: Loại bỏ định dạng tùy chỉnh

Sau khi các client đã chuyển đổi, hãy loại bỏ định dạng tùy chỉnh và trả về RFC 9457 theo mặc định.

Kết luận

RFC 9457 cung cấp một định dạng tiêu chuẩn cho các phản hồi lỗi API. Nó thay thế các định dạng lỗi tùy chỉnh bằng một cấu trúc nhất quán, có thể đọc được bằng máy mà các client có thể phân tích cú pháp bằng lập trình.

Modern PetstoreAPI triển khai RFC 9457 trên tất cả các phản hồi lỗi, minh họa cách cấu trúc lỗi đúng cách với chi tiết xác thực phù hợp, URL loại lỗi và mã trạng thái HTTP.

Sử dụng Apidog để kiểm tra sự tuân thủ RFC 9457, xác thực cấu trúc lỗi và đảm bảo API của bạn trả về các phản hồi lỗi phù hợp.

Câu hỏi thường gặp

RFC 9457 có bắt buộc đối với API REST không?

Không, nhưng đây là tiêu chuẩn được khuyến nghị. Việc sử dụng RFC 9457 giúp API của bạn nhất quán hơn và dễ tích hợp hơn cho các client.

Tôi có thể sử dụng RFC 9457 với XML không?

Có, RFC 9457 định nghĩa cả hai định dạng JSON (application/problem+json) và XML (application/problem+xml).

Tôi có nên luôn bao gồm tất cả năm trường tiêu chuẩn không?

type, titlestatus là bắt buộc. detailinstance là tùy chọn nhưng được khuyến nghị để có ngữ cảnh lỗi tốt hơn.

Tôi có thể thêm các trường tùy chỉnh vào phản hồi RFC 9457 không?

Có, RFC 9457 có khả năng mở rộng. Bạn có thể thêm các trường tùy chỉnh như errors, retryAfter hoặc traceId để có thêm ngữ cảnh.

Tôi xử lý lỗi xác thực với RFC 9457 như thế nào?

Thêm một mảng errors tùy chỉnh với chi tiết cấp trường. Modern PetstoreAPI minh họa mẫu này trong các phản hồi lỗi xác thực của nó.

URL loại lỗi nên trỏ đến đâu?

Nó nên trỏ đến tài liệu dễ đọc giải thích loại lỗi, các nguyên nhân có thể và cách khắc phục.

Tôi có cần thay đổi mã trạng thái HTTP khi sử dụng RFC 9457 không?

Không, RFC 9457 hoạt động với các mã trạng thái HTTP tiêu chuẩn. Trường status trong phản hồi phải khớp với mã trạng thái HTTP.

Tôi kiểm tra sự tuân thủ RFC 9457 như thế nào?

Sử dụng Apidog để xác thực cấu trúc phản hồi lỗi, kiểm tra các trường bắt buộc và xác minh kiểu nội dung khớp với các thông số kỹ thuật của RFC 9457.

Thực hành thiết kế API trong Apidog

Khám phá cách dễ dàng hơn để xây dựng và sử dụng API