Bạn đang xây dựng giao diện người dùng (frontend), nhưng phần backend chưa sẵn sàng. Bạn cần một REST API trả về JSON thực tế ngay lập tức, với các hoạt động GET, POST, PUT, và DELETE đầy đủ, để bạn có thể tiếp tục viết mã thay vì phải chờ đợi.
Đó là lý do `json-server` ra đời. Chỉ cần trỏ nó vào một tệp JSON duy nhất và nó sẽ cung cấp một REST API đầy đủ trong vài giây, không yêu cầu mã backend nào. Người anh em của nó, JSONPlaceholder, còn tiến xa hơn một bước: một API giả lập được lưu trữ mà bạn có thể gọi mà không cần cài đặt bất cứ thứ gì. Hướng dẫn này sẽ chỉ cho bạn cách sử dụng cả hai, những giới hạn của chúng, và khi nào nên chuyển sang một mock API nhận biết lược đồ (schema-aware mock) trong Apidog.
Để có cái nhìn tổng quát hơn về việc giả lập các endpoint, hãy xem mock API là gì. Ở đây chúng ta sẽ tập trung vào hai công cụ mà các nhà phát triển thường tìm đến đầu tiên.
json-server là gì?
`json-server` là một công cụ npm mã nguồn mở biến một tệp JSON thuần túy thành một REST API thực sự. Bạn viết một tệp `db.json` mô tả tài nguyên của mình, chạy một lệnh, và bạn sẽ có các tuyến CRUD tiêu chuẩn được hỗ trợ bởi tệp đó. Các yêu cầu ghi (write requests) thực sự sửa đổi tệp, vì vậy dữ liệu sẽ tồn tại giữa các yêu cầu trong suốt phiên làm việc của bạn.
Đây là cách nhanh nhất để có được một API hoạt động cho việc tạo mẫu (prototyping), phát triển frontend, trình diễn (demos) và kiểm thử, mà không cần phải thiết lập cơ sở dữ liệu hay viết mã máy chủ. Dự án này có trên GitHub và được sử dụng rộng rãi cho chính công việc này.
Cài đặt và chạy json-server
Cài đặt từ npm:
npm install json-server
Tạo một tệp `db.json` trong dự án của bạn. Các khóa mảng cấp cao nhất sẽ trở thành các tuyến tài nguyên tập hợp (collection routes); các đối tượng cấp cao nhất sẽ trở thành các tuyến tài nguyên đơn lẻ (single-resource routes):
{
"posts": [
{ "id": "1", "title": "First post", "views": 100 },
{ "id": "2", "title": "Second post", "views": 250 }
],
"comments": [
{ "id": "1", "text": "Nice work", "postId": "1" }
],
"profile": {
"name": "apidog"
}
}
Khởi động máy chủ:
npx json-server db.json
Theo mặc định, nó chạy tại `http://localhost:3000`. Vậy là xong; giờ bạn đã có một API hoạt động.
Lưu ý về phiên bản: json-server v1 đã loại bỏ cờ `--watch` cũ, vì vậy `npx json-server db.json` là lệnh hiện tại. Nếu bạn đang sử dụng phiên bản 0.x cũ hơn, bạn vẫn sẽ thấy `json-server --watch db.json` trong các hướng dẫn.
Các tuyến (routes) bạn nhận được miễn phí
Từ tệp `db.json` ở trên, json-server tạo ra một giao diện REST hoàn chỉnh.
Đối với mảng `posts`:
GET /posts
GET /posts/:id
POST /posts
PUT /posts/:id
PATCH /posts/:id
DELETE /posts/:id
Đối với đối tượng `profile`:
GET /profile
PUT /profile
PATCH /profile
Chức năng truy vấn cũng được tích hợp sẵn. Cú pháp v1 sử dụng dấu hai chấm cho các điều kiện:
GET /posts?views:gt=100 # views lớn hơn 100
GET /posts?views:lte=50 # views nhỏ hơn hoặc bằng 50
GET /posts?_sort=-views # sắp xếp theo views, giảm dần
GET /posts?_page=1&_per_page=25 # phân trang
GET /posts?_embed=comments # bao gồm các bình luận liên quan
Các toán tử có sẵn bao gồm `lt`, `lte`, `gt`, `gte`, `eq`, `ne`, `in`, `contains`, `startsWith`, và `endsWith`. Đối với một tệp phẳng và một lệnh duy nhất, đó là một lượng lớn API.
JSONPlaceholder: một API giả lập không cần thiết lập
Đôi khi bạn thậm chí không muốn cài đặt một công cụ nào. JSONPlaceholder, từ cùng tác giả, là một REST API giả lập miễn phí được lưu trữ tại jsonplaceholder.typicode.com. Bạn gọi nó trực tiếp từ mã của mình:
curl https://jsonplaceholder.typicode.com/posts/1
{
"userId": 1,
"id": 1,
"title": "sunt aut facere repellat provident",
"body": "quia et suscipit..."
}
Nó đi kèm với sáu tài nguyên có sẵn:
- `/posts` (100 mục)
- `/comments` (500)
- `/albums` (100)
- `/photos` (5000)
- `/todos` (200)
- `/users` (10)
Nó cũng chấp nhận các yêu cầu POST, PUT, PATCH và DELETE, nhưng đây là điểm mấu chốt: các thao tác ghi (writes) chỉ là giả lập. API trả về một phản hồi thực tế như thể thay đổi đã xảy ra, nhưng không có gì được lưu. Làm mới trang và bài đăng "mới" của bạn sẽ biến mất. Điều này ổn cho việc kết nối mã UI với dữ liệu có thể dự đoán; nó không phải là một backend thực sự.
json-server so với JSONPlaceholder
| json-server | JSONPlaceholder | |
|---|---|---|
| Thiết lập | Cài đặt gói npm, viết db.json |
Không cần, chỉ cần gọi URL |
| Chạy trên | Cục bộ, máy của bạn | Được lưu trữ, công khai |
| Dữ liệu tùy chỉnh | Có, tài nguyên của riêng bạn | Không, tài nguyên cố định |
| Ghi dữ liệu có được lưu? | Có, vào db.json |
Không, giả lập |
| Tốt nhất cho | Tạo mẫu với cấu trúc dữ liệu của riêng bạn | Thử nghiệm nhanh và học tập |
Hãy sử dụng JSONPlaceholder khi bạn cần dữ liệu ngay lập tức và không quan tâm dữ liệu đó là gì. Hãy sử dụng json-server khi bạn cần tài nguyên của riêng mình và các thao tác ghi dữ liệu được lưu lại.
Những giới hạn của các công cụ này
`json-server` và JSONPlaceholder rất xuất sắc ở một việc: phục vụ JSON nhanh chóng. Chúng bắt đầu bộc lộ hạn chế khi một dự án phát triển vượt qua giai đoạn tạo mẫu một mình.
- Không có xác thực thực tế. Chúng không thực thi lược đồ (schema). Gửi một chuỗi vào vị trí của một số và nó vẫn được lưu trữ một cách vui vẻ. API thực của bạn sẽ từ chối điều đó.
- Không có dữ liệu động hoặc thông minh. Phản hồi là bất cứ thứ gì nằm trong tệp. Không có cách tích hợp sẵn để trả về một email ngẫu nhiên mới hoặc một ngày trong tương lai cho mỗi yêu cầu.
- Cục bộ và chỉ một người dùng. json-server chạy trên máy tính xách tay của bạn. Một đồng đội hoặc một tác vụ CI không thể truy cập `localhost:3000`. JSONPlaceholder được chia sẻ, nhưng bạn không thể tùy chỉnh nó.
- Lệch khỏi đặc tả của bạn. Dữ liệu giả lập nằm trong một tệp riêng biệt, không liên kết với hợp đồng OpenAPI của bạn, vì vậy hai thứ này sẽ lệch nhau khi API phát triển.
- Ghi dữ liệu giả lập (JSONPlaceholder). Bất kỳ thứ gì có trạng thái, như giỏ hàng hoặc quy trình nhiều bước, không thể được kiểm tra với nó.
Nếu bạn đã vượt qua giới hạn của một tệp phẳng, các bài tổng hợp của chúng tôi về các công cụ giả lập endpoint REST và các máy chủ mock API miễn phí và giá rẻ sẽ bao gồm cấp độ tiếp theo, và so sánh các công cụ mock API trực tuyến sẽ đặt các lựa chọn được lưu trữ cạnh nhau.
Khi nào nên chuyển sang máy chủ mock thực sự
Một mock nhận biết lược đồ (schema-aware mock) khắc phục mọi hạn chế trên. Đây là lúc Apidog tiếp quản từ json-server.

- Theo lược đồ, không theo tệp. Định nghĩa một endpoint (hoặc nhập đặc tả OpenAPI của bạn) và Apidog sẽ tự động giả lập nó. Mock và hợp đồng luôn đồng bộ vì chúng là cùng một định nghĩa.
- Dữ liệu thông minh, động. Apidog đọc tên và kiểu trường và trả về các giá trị thực tế: một email hợp lệ cho trường `email`, một ngày cho `createdAt`, một số cho `price`. Bạn có thể gắn các quy tắc kiểu Faker cho mỗi trường để kiểm soát hoàn toàn. Hướng dẫn của chúng tôi về Faker.js trong Apidog và bài hướng dẫn tổng quát hơn về trình tạo dữ liệu kiểm thử sẽ đi sâu hơn vào việc tạo ra các giá trị thực tế.
- URL đám mây có thể chia sẻ. Apidog cung cấp cho mock một URL được lưu trữ mà toàn bộ nhóm của bạn và quy trình CI của bạn có thể gọi, chứ không chỉ `localhost`.
- Không yêu cầu Node. Không có gói nào để cài đặt cho mỗi dự án và không cần phải quản lý tệp `db.json`.
Giả lập cùng API trong Apidog
- Tải Apidog và tạo hoặc mở một dự án.
- Thêm một endpoint, ví dụ `GET /posts`, và định nghĩa lược đồ phản hồi của nó (hoặc nhập một tệp OpenAPI hiện có).
- Apidog tạo ra một URL mock và bắt đầu trả về dữ liệu thông minh, thực tế cho mọi trường ngay lập tức.
- Cần các giá trị cụ thể? Thêm một quy tắc mock cho mỗi trường để cố định đầu ra.
- Chia sẻ URL mock với nhóm của bạn hoặc đưa nó vào bộ kiểm thử và CI của bạn.

Bạn vẫn giữ được tốc độ "API trong vài phút" của json-server, đồng thời có được khả năng xác thực, dữ liệu động và một URL mà mọi người đều có thể truy cập.
Câu hỏi thường gặp
json-server có miễn phí không? Có, nó là mã nguồn mở và miễn phí sử dụng. JSONPlaceholder cũng miễn phí.
json-server có lưu trữ dữ liệu không? Có. Các yêu cầu POST, PUT, PATCH và DELETE ghi lại vào tệp `db.json` của bạn, vì vậy các thay đổi sẽ tồn tại giữa các yêu cầu trong khi máy chủ đang chạy. JSONPlaceholder giả lập việc ghi và không lưu bất cứ thứ gì.
Tôi có thể sử dụng json-server trong môi trường production không? Không. Nó được xây dựng để tạo mẫu và kiểm thử. Nó không có xác thực thực tế, xác thực người dùng (auth) hoặc khả năng mở rộng.
Sự khác biệt giữa json-server và một máy chủ mock như Apidog là gì? json-server phục vụ một tệp tĩnh dưới dạng API. Apidog giả lập từ lược đồ API của bạn, trả về dữ liệu động thực tế và hiển thị một URL đám mây được chia sẻ. Xem mock API là gì và tổng hợp các công cụ mock REST để biết thêm ngữ cảnh.
Làm thế nào để tôi có được dữ liệu giả lập thực tế thay vì các hàng tĩnh? Sử dụng một trình tạo. Một trình tạo dữ liệu kiểm thử tạo ra các bản ghi đa dạng, thực tế, và tính năng mock của Apidog thực hiện điều này tự động từ lược đồ của bạn.
Tóm tắt
`json-server` biến một tệp JSON thành một REST API hoạt động chỉ với một lệnh, và JSONPlaceholder cung cấp cho bạn một API giả lập được lưu trữ mà không cần bất kỳ thiết lập nào. Cả hai đều hoàn hảo để giúp bạn giải quyết các trở ngại một cách nhanh chóng. Một khi bạn cần xác thực lược đồ, dữ liệu động, trạng thái bền vững và một URL mà nhóm của bạn có thể thực sự truy cập, một tệp phẳng sẽ không đủ. Đó là lúc máy chủ mock của Apidog tiếp quản. Tải Apidog, nhập đặc tả của bạn, và mock của bạn sẽ khớp với hợp đồng thực tế ngay từ yêu cầu đầu tiên.
