DEV Community

Cover image for Cách kiểm thử API giả lập và xây dựng API ảo của riêng bạn
Sebastian Petrus
Sebastian Petrus

Posted on • Originally published at apidog.com

Cách kiểm thử API giả lập và xây dựng API ảo của riêng bạn

Khi xây dựng frontend, debug client hoặc học một thư viện HTTP mới, bạn thường cần một endpoint trả về JSON “giống thật” mà không phải dựng backend. Dummy API giải quyết đúng nhu cầu đó: một API công khai, miễn phí, có thể gọi ngay để lấy dữ liệu mẫu. Bài viết này hướng dẫn cách chọn dummy API phù hợp, gọi chúng bằng curl, fetch, Python, và khi nào nên chuyển sang tự xây dựng fake REST API của riêng bạn. Nếu bạn muốn nắm nền tảng về cách gọi API từ trình duyệt, hãy xem thêm hướng dẫn Fetch API của MDN.

Dùng thử Apidog ngay hôm nay

Dummy API thực chất là gì?

Dummy API là một dịch vụ được host sẵn, trả về JSON mẫu cho các tài nguyên phổ biến như:

  • Users
  • Posts
  • Comments
  • Products
  • Carts
  • Todos

Bạn không cần đăng ký, không cần database và không phải lo ảnh hưởng dữ liệu production.

Hầu hết dummy API hỗ trợ các method quen thuộc:

GET
POST
PUT
PATCH
DELETE
Enter fullscreen mode Exit fullscreen mode

Tuy nhiên, cần lưu ý: các thao tác ghi thường chỉ là giả lập. Ví dụ, khi bạn gửi POST, server có thể trả về payload kèm một id, nhưng dữ liệu đó không được lưu bền vững.

Nên dùng dummy API khi bạn cần:

  • Prototype nhanh UI
  • Test logic gọi API
  • Học fetch, Axios, React Query, SWR
  • Demo phân trang, loading state, empty state

Không nên dùng dummy API khi bạn cần:

  • Schema đúng với sản phẩm của bạn
  • Dữ liệu có trạng thái
  • Test lỗi tùy chỉnh như 429, 500, timeout
  • Đồng bộ với hợp đồng OpenAPI thật

Các dummy API và fake API miễn phí tốt nhất để kiểm thử

Dưới đây là các API công khai hữu ích nhất cho developer. Tất cả đều miễn phí và không yêu cầu bạn tự dựng backend.

1. JSONPlaceholder

JSONPlaceholder là lựa chọn kinh điển để test các request đọc dữ liệu.

Nó cung cấp các tài nguyên liên quan với nhau:

  • posts
  • comments
  • albums
  • photos
  • todos
  • users

Ví dụ gọi một bài viết:

curl https://jsonplaceholder.typicode.com/posts/1
Enter fullscreen mode Exit fullscreen mode

Response mẫu:

{
  "userId": 1,
  "id": 1,
  "title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
  "body": "quia et suscipit..."
}
Enter fullscreen mode Exit fullscreen mode

Bạn cũng có thể test quan hệ dữ liệu, ví dụ lấy comments của một post:

curl https://jsonplaceholder.typicode.com/posts/1/comments
Enter fullscreen mode Exit fullscreen mode

Ví dụ POST:

curl -X POST https://jsonplaceholder.typicode.com/posts \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Hello API",
    "body": "Testing dummy API",
    "userId": 1
  }'
Enter fullscreen mode Exit fullscreen mode

JSONPlaceholder sẽ trả về một object có id, nhưng dữ liệu không được lưu thật.

2. DummyJSON

DummyJSON phù hợp hơn nếu bạn cần dữ liệu gần với ứng dụng thực tế, đặc biệt là e-commerce.

Nó có các nhóm dữ liệu như:

  • Products
  • Carts
  • Users
  • Posts
  • Comments
  • Quotes
  • Todos
  • Recipes

Lấy thông tin một sản phẩm:

curl https://dummyjson.com/products/1
Enter fullscreen mode Exit fullscreen mode

Tìm kiếm sản phẩm:

curl "https://dummyjson.com/products/search?q=phone"
Enter fullscreen mode Exit fullscreen mode

Phân trang danh sách sản phẩm:

curl "https://dummyjson.com/products?limit=10&skip=20"
Enter fullscreen mode Exit fullscreen mode

DummyJSON cũng có auth flow để thực hành lưu token:

curl -X POST https://dummyjson.com/auth/login \
  -H "Content-Type: application/json" \
  -d '{
    "username": "emilys",
    "password": "emilyspass"
  }'
Enter fullscreen mode Exit fullscreen mode

Response sẽ bao gồm token để bạn test các request đã xác thực mà không cần tích hợp identity provider thật.

3. reqres.in

reqres.in tập trung vào vòng đời request/response:

  • List users
  • Single user
  • Register
  • Login
  • Delayed response

Điểm cần lưu ý: gói miễn phí hiện yêu cầu API key header.

curl https://reqres.in/api/users/2 \
  -H "x-api-key: reqres-free-v1"
Enter fullscreen mode Exit fullscreen mode

Nếu thiếu header này, bạn có thể nhận lỗi 401.

Ví dụ test response trễ:

curl "https://reqres.in/api/users?delay=3" \
  -H "x-api-key: reqres-free-v1"
Enter fullscreen mode Exit fullscreen mode

Endpoint này hữu ích để kiểm tra loading state hoặc skeleton UI.

Khi nào nên dùng từng dummy API?

Dummy API Tốt nhất cho Luồng xác thực Khả năng lưu dữ liệu
JSONPlaceholder Dữ liệu blog, quan hệ lồng nhau Không Giả lập, không lưu
DummyJSON E-commerce, giỏ hàng, đăng nhập Có token Giả lập, không lưu
reqres.in Phân trang, đăng ký, đăng nhập, delay Header API key Giả lập, không lưu

Nếu bạn muốn thêm lựa chọn ngoài ba API trên, danh sách các API công khai để kiểm thử có nhiều lựa chọn chuyên biệt hơn. Khi cần dữ liệu theo chủ đề như thời tiết, tiền tệ hoặc nội dung mẫu, bạn cũng có thể tham khảo danh sách API công khai miễn phí cho developer.

Cách gọi dummy API trong code

Việc gọi dummy API giống như gọi bất kỳ HTTP endpoint nào khác.

Gọi bằng JavaScript fetch

Ví dụ đọc thông tin user từ DummyJSON:

const res = await fetch('https://dummyjson.com/users/1');

if (!res.ok) {
  throw new Error(`Request failed: ${res.status}`);
}

const user = await res.json();

console.log(user.firstName);
console.log(user.email);
Enter fullscreen mode Exit fullscreen mode

Ví dụ tạo user mới:

const res = await fetch('https://dummyjson.com/users/add', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    firstName: 'Ada',
    lastName: 'Lovelace',
    age: 28,
  }),
});

if (!res.ok) {
  throw new Error(`Request failed: ${res.status}`);
}

const createdUser = await res.json();

console.log(createdUser);
Enter fullscreen mode Exit fullscreen mode

Lưu ý: object trả về có thể có id, nhưng dữ liệu không được lưu thật trên server.

Gọi bằng Axios

import axios from 'axios';

const { data } = await axios.get('https://dummyjson.com/products/1');

console.log(data.title);
console.log(data.price);
Enter fullscreen mode Exit fullscreen mode

Xử lý lỗi cơ bản:

import axios from 'axios';

try {
  const { data } = await axios.get('https://dummyjson.com/products/999999');
  console.log(data);
} catch (error) {
  if (error.response) {
    console.error('Status:', error.response.status);
    console.error('Body:', error.response.data);
  } else {
    console.error('Network error:', error.message);
  }
}
Enter fullscreen mode Exit fullscreen mode

Gọi bằng Python

import requests

response = requests.get("https://jsonplaceholder.typicode.com/todos/1")
response.raise_for_status()

todo = response.json()

print(todo)
Enter fullscreen mode Exit fullscreen mode

Ví dụ gửi POST:

import requests

payload = {
    "title": "Learn dummy API",
    "completed": False,
    "userId": 1
}

response = requests.post(
    "https://jsonplaceholder.typicode.com/todos",
    json=payload
)

response.raise_for_status()

print(response.json())
Enter fullscreen mode Exit fullscreen mode

Nếu bạn cần dữ liệu kiểm thử đáng tin cậy hơn cho assertion, hướng dẫn về tạo dữ liệu kiểm thử API thực tế giải thích cách tạo tên, email, timestamp và dữ liệu mẫu gần với production hơn thay vì dùng các giá trị như test123.

Khi dummy API công khai không còn đủ

Dummy API công khai rất tiện cho thử nghiệm nhanh, nhưng sẽ bị giới hạn khi dự án trở nên cụ thể hơn.

Bạn nên chuyển sang mock API riêng khi gặp các tình huống sau.

1. Schema không khớp với ứng dụng

Ứng dụng của bạn có thể cần response như sau:

{
  "id": "cus_123",
  "email": "user@example.com",
  "subscription_tier": "pro",
  "billing": {
    "status": "active",
    "next_invoice_at": "2026-07-01T00:00:00Z"
  }
}
Enter fullscreen mode Exit fullscreen mode

Trong khi JSONPlaceholder chỉ có posts, albums, todos. Bạn không thể bắt một dummy API công khai trả về đúng schema sản phẩm của mình.

2. Bạn cần trạng thái thật

Ví dụ, với giỏ hàng:

  1. User thêm sản phẩm A
  2. User thêm sản phẩm B
  3. UI cần hiển thị tổng tiền mới
  4. User xóa sản phẩm A

Dummy API thường không lưu trạng thái giữa các request. Sau khi POST xong, dữ liệu “đã tạo” sẽ biến mất.

3. Bạn cần kiểm soát lỗi

Frontend cần được test với nhiều case:

  • 400 Bad Request
  • 401 Unauthorized
  • 403 Forbidden
  • 404 Not Found
  • 429 Too Many Requests
  • 500 Internal Server Error
  • Response chậm 5 giây
  • Body sai format

Các API công khai thường không cho bạn cấu hình những tình huống này theo nhu cầu.

4. Frontend bắt đầu trước backend

Trong nhiều team, frontend và backend phát triển song song. Frontend cần endpoint hoạt động ngay theo hợp đồng đã thống nhất, trong khi backend chưa triển khai xong.

Lúc này, bạn không cần “mượn” một API công khai nữa. Bạn cần một mock API được xây dựng để kiểm thử, trả về đúng schema, đúng status code và đúng behavior mà ứng dụng của bạn cần.

Cách xây dựng fake API của riêng bạn với Apidog

Apidog là nền tảng API kết hợp thiết kế, kiểm thử, debug và mocking trong cùng một nơi.

Điểm hữu ích với mock API là: bạn định nghĩa schema endpoint, sau đó Apidog có thể tạo dữ liệu mock dựa trên schema đó. Ví dụ:

  • Trường email trả về email mẫu
  • Trường createdAt trả về timestamp
  • Trường price trả về số
  • Trường country có thể được cấu hình để trả về tên quốc gia

Apidog mock API

Quy trình cơ bản theo tài liệu mock API data trong Apidog:

Bước 1: Tạo hoặc nhập endpoint

Bạn có thể:

  • Tạo API mới trực tiếp trong Apidog
  • Nhập file OpenAPI
  • Nhập file Swagger

Sau khi import, Apidog đọc schema của endpoint để biết response cần có những field nào.

Bước 2: Định nghĩa response schema

Ví dụ response cho endpoint GET /customers/{id}:

{
  "id": "string",
  "email": "string",
  "name": "string",
  "subscription_tier": "string",
  "billing": {
    "status": "string",
    "next_invoice_at": "string"
  }
}
Enter fullscreen mode Exit fullscreen mode

Bạn có thể cấu hình từng field để dữ liệu mock thực tế hơn.

Bước 3: Gọi mock URL như API thật

Apidog cung cấp mock URL cho endpoint. Frontend có thể gọi URL này như gọi backend thật:

const res = await fetch('https://mock-url.example.com/customers/cus_123');
const customer = await res.json();

console.log(customer.subscription_tier);
Enter fullscreen mode Exit fullscreen mode

Điểm khác biệt so với dummy API công khai: response khớp với contract của chính bạn.

Bước 4: Thêm lỗi và điều kiện

Bạn có thể cấu hình mock để trả về các case như:

200 OK
404 Not Found
500 Internal Server Error
Enter fullscreen mode Exit fullscreen mode

Hoặc response trễ để test loading state.

Ví dụ frontend có thể xử lý lỗi như sau:

const res = await fetch('/api/customers/cus_123');

if (res.status === 404) {
  showNotFoundMessage();
} else if (res.status >= 500) {
  showRetryMessage();
} else {
  const customer = await res.json();
  renderCustomer(customer);
}
Enter fullscreen mode Exit fullscreen mode

Vì mock được tạo từ spec, khi schema thay đổi, mock cũng có thể được cập nhật theo contract mới. Nếu bạn muốn đi sâu hơn vào cách tạo dữ liệu mock từ spec, hãy xem hướng dẫn về tạo dữ liệu mock từ OpenAPI schemas.

Dummy API công khai so với mock API Apidog

Nhu cầu Dummy API công khai Mock API Apidog
Cần JSON nhanh để prototype Rất tốt Rất tốt
Cần schema đúng với sản phẩm Không
Cần response lỗi tùy chỉnh Không
Cần delay tùy chỉnh Không hoặc hạn chế
Cần khớp OpenAPI contract Không
Thời gian thiết lập Gần như bằng 0 Vài phút

Không có lựa chọn nào luôn tốt hơn. Cách dùng thực tế thường là:

  • Dùng dummy API công khai cho demo nhanh, học thư viện, thử UI.
  • Dùng mock API riêng khi code sẽ đi vào dự án thật hoặc cần bám theo contract.

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

Dummy API có giống mock API không?

Có phần giống nhau, nhưng không hoàn toàn.

Dummy API thường là dịch vụ công khai, dùng chung, trả về dữ liệu mẫu cố định. JSONPlaceholder là ví dụ điển hình.

Mock API là API bạn tự định nghĩa và kiểm soát. Bạn quyết định schema, status code, delay, lỗi và các điều kiện response.

Nói ngắn gọn: dummy API là một dạng mock được người khác host sẵn. Nếu muốn phân biệt kỹ hơn, bạn có thể đọc phần giải thích mock API là gì.

Fake API miễn phí có an toàn để dùng với dữ liệu thật không?

Không.

Đừng gửi các dữ liệu sau tới dummy API công khai:

  • Dữ liệu người dùng thật
  • Email khách hàng thật
  • Token
  • API key
  • Password
  • Dữ liệu nội bộ công ty

Hãy giả định mọi thứ bạn gửi lên API công khai đều có thể bị log lại. Chỉ dùng dữ liệu test dùng một lần.

Dummy API có lưu dữ liệu tôi gửi không?

Hầu như không.

JSONPlaceholder, DummyJSON và reqres.in đều có thể chấp nhận request ghi như POST, PUT, PATCH, DELETE, nhưng dữ liệu thường không được lưu bền vững.

Ví dụ, bạn có thể nhận response như đã tạo thành công:

{
  "id": 101,
  "title": "Hello"
}
Enter fullscreen mode Exit fullscreen mode

Nhưng nếu gọi lại danh sách, bản ghi đó sẽ không tồn tại.

Nếu cần trạng thái thật, bạn cần mock có state hoặc backend thật.

Tôi có thể xây dựng fake API mà không cần viết code không?

Có.

Với Apidog, bạn có thể định nghĩa endpoint, response schema và để mock server tạo dữ liệu. Bạn cũng có thể import OpenAPI/Swagger để có mock endpoint hoạt động mà không cần viết server code.

Tổng kết

Dummy API công khai như JSONPlaceholder, DummyJSON và reqres.in là cách nhanh nhất để lấy JSON mẫu cho prototype, học thư viện HTTP và test UI cơ bản.

Nhưng khi bạn cần schema riêng, trạng thái thật, lỗi có kiểm soát hoặc contract OpenAPI chính xác, hãy tạo mock API của riêng bạn.

Apidog giúp bạn nhập spec, tạo dữ liệu mock dựa trên schema và gọi endpoint mock trong vài phút. Tải Apidog để biến API contract tiếp theo của bạn thành mock hoạt động trước khi backend được triển khai.

Top comments (0)