I. Giới thiệu
Trong bài học trước, chúng ta đã thiết lập môi trường backend cơ bản và tạo một server đơn giản sử dụng Node.js và Express. Tuy nhiên, backend không chỉ là chạy được server. Trọng tâm của backend là thiết kế và triển khai các hệ thống giao tiếp dữ liệu hiệu quả, bảo mật, và tuân thủ tiêu chuẩn.
Để làm được điều đó, bạn cần hiểu kỹ HTTP, nắm rõ khái niệm RESTful API, và triển khai đầy đủ mô hình CRUD. Bài học hôm nay sẽ đi theo trình tự: lý thuyết nền tảng → phân tích thiết kế → hiện thực hóa bằng mã nguồn.

II. HTTP – Giao thức nền tảng của Web
1. HTTP là gì?
HTTP (HyperText Transfer Protocol) là giao thức truyền tải dữ liệu giữa client (thường là trình duyệt hoặc ứng dụng frontend) và server (backend). HTTP hoạt động trên mô hình request-response:
- Client gửi một HTTP request
- Server xử lý và gửi HTTP response về
HTTP là giao thức không trạng thái (stateless): mỗi request là độc lập, server không ghi nhớ các request trước đó.

2. Cấu trúc của HTTP Request
Một HTTP request bao gồm:
- Phương thức (Method): Xác định loại hành động (GET, POST, PUT, DELETE…)
- Đường dẫn (URL): Chỉ định tài nguyên cụ thể
- Header: Thông tin bổ sung như loại dữ liệu (Content-Type), mã hoá, token xác thực
- Body: Dữ liệu thực tế được gửi (chỉ có ở POST, PUT…)
Ví dụ một request POST:
POST /users HTTP/1.1
Host: example.com
Content-Type: application/json
{
"name": "Alice",
"email": "[email protected]"
}

3. HTTP Response
Response trả về cho client sẽ có:
- Status Code: Mã trạng thái HTTP, ví dụ:
- 200: OK
- 201: Created
- 400: Bad Request
- 404: Not Found
- 500: Internal Server Error
- Headers
- Body: Thường là dữ liệu JSON
III. RESTful API – Thiết kế API theo chuẩn công nghiệp
1. REST là gì?
REST (Representational State Transfer) là một mô hình kiến trúc dùng để xây dựng các hệ thống phân tán như web service. Khi API được xây dựng theo nguyên tắc REST, nó được gọi là RESTful API.
REST hướng đến:
- Tài nguyên (resource) là trung tâm, mỗi resource có 1 URL
- Dùng các HTTP method để thao tác tài nguyên
- Phản hồi bằng định dạng thống nhất (thường là JSON)
- Giao tiếp không trạng thái (stateless)
- Sử dụng chuẩn HTTP đầy đủ (status code, method, header)
2. RESTful API và CRUD
CRUD là viết tắt của:
- Create: Tạo mới tài nguyên → POST
- Read: Đọc tài nguyên → GET
- Update: Cập nhật tài nguyên → PUT hoặc PATCH
- Delete: Xoá tài nguyên → DELETE
Tác vụ | HTTP Method | Endpoint | Ý nghĩa |
---|---|---|---|
Create user | POST | /users | Thêm người dùng mới |
Read all users | GET | /users | Lấy danh sách người dùng |
Read one user | GET | /users/:id | Lấy chi tiết một người dùng |
Update user | PUT | /users/:id | Cập nhật toàn bộ thông tin |
Delete user | DELETE | /users/:id | Xóa một người dùng |
IV. Thực hành: Xây dựng User CRUD API
Chúng ta sẽ xây dựng một API đơn giản để quản lý người dùng. Dữ liệu sẽ lưu tạm trong biến (chưa dùng database).
1. Tạo project
mkdir backend-lesson-02
cd backend-lesson-02
npm init -y
npm install express
2. Cấu trúc thư mục
backend-lesson-02/
├── index.js # Điểm vào chính của app
└── routes/
└── users.js # Các API liên quan đến user
3. File index.js
const express = require('express');
const app = express();
const usersRouter = require('./routes/users');
app.use(express.json());
app.use('/users', usersRouter);
app.listen(3000, () => {
console.log('Server is running on http://localhost:3000');
});
4. File routes/users.js
const express = require('express');
const router = express.Router();
// Giả lập dữ liệu người dùng
let users = [
{ id: 1, name: 'Alice' },
{ id: 2, name: 'Bob' }
];
// GET /users
router.get('/', (req, res) => {
res.json(users);
});
// GET /users/:id
router.get('/:id', (req, res) => {
const user = users.find(u => u.id === parseInt(req.params.id));
if (!user) return res.status(404).send('User not found');
res.json(user);
});
// POST /users
router.post('/', (req, res) => {
const newUser = {
id: users.length + 1,
name: req.body.name
};
users.push(newUser);
res.status(201).json(newUser);
});
// PUT /users/:id
router.put('/:id', (req, res) => {
const user = users.find(u => u.id === parseInt(req.params.id));
if (!user) return res.status(404).send('User not found');
user.name = req.body.name;
res.json(user);
});
// DELETE /users/:id
router.delete('/:id', (req, res) => {
const userIndex = users.findIndex(u => u.id === parseInt(req.params.id));
if (userIndex === -1) return res.status(404).send('User not found');
users.splice(userIndex, 1);
res.status(204).send();
});
module.exports = router;
V. Kiến thức nâng cao và chuẩn hóa
1. Status code theo chuẩn REST
Mã | Ý nghĩa |
---|---|
200 | Thành công (GET, PUT) |
201 | Tạo mới thành công (POST) |
204 | Thành công nhưng không trả dữ liệu (DELETE) |
400 | Yêu cầu sai dữ liệu |
404 | Không tìm thấy tài nguyên |
500 | Lỗi nội bộ server |
2. Các nguyên tắc REST tốt
- Không dùng động từ trong URL (
/createUser
) → Sai - Tài nguyên nên đặt ở số nhiều (
/users
) → Đúng - Tách endpoint theo thực thể (resource-based routing)
- Không lặp lại logic xử lý dữ liệu giữa các method

VI. Bài tập thực hành
- Tạo thêm một router
products.js
với đầy đủ CRUD - Kiểm thử toàn bộ API bằng Postman
- Thêm kiểm tra dữ liệu đầu vào: tên không được trống, id phải hợp lệ
- Ghi chú rõ trong mã về mỗi bước xử lý logic
VII. Chuẩn bị cho bài sau
Bài 3: Kết nối cơ sở dữ liệu – MySQL và Sequelize ORM
Ở bài kế tiếp, bạn sẽ học cách:
- Thiết kế bảng dữ liệu
- Kết nối Express với MySQL thông qua ORM
- Ánh xạ tài nguyên thành bảng và truy vấn thật
Sign up