Kiến thức nền tảng về Web API (HTTP & Auth)
Trước khi bắt tay vào viết code, bạn cần hiểu rõ cách thức hoạt động của giao thức HTTP và các phương pháp bảo mật cơ bản. Đây là nền tảng cốt lõi của bất kỳ hệ thống Backend nào.1. Mô hình HTTP Request & Response
Giao thức HTTP hoạt động theo mô hình Client-Server. Client (ví dụ: trình duyệt, Postman, ứng dụng điện thoại) gửi một Request yêu cầu dịch vụ, và Server (ứng dụng NestJS của bạn) phản hồi bằng một Response.- Cấu trúc HTTP Request
- Cấu trúc HTTP Response
Một Request gửi lên Server bao gồm:
- HTTP Method: Hành động muốn thực hiện (GET, POST, PATCH…).
- URL/Path: Địa chỉ tài nguyên (ví dụ:
/products/12). - Params (Tham số):
- Path Params: Nằm trực tiếp trên URL để định danh tài nguyên (ví dụ:
/products/:id->/products/12). - Query Params: Tham số tùy chọn sau dấu
?để lọc, sắp xếp, phân trang (ví dụ:/products?limit=10&page=2).
- Path Params: Nằm trực tiếp trên URL để định danh tài nguyên (ví dụ:
- Headers: Metadata chứa thông tin bổ sung như kiểu dữ liệu (
Content-Type: application/json), thông tin xác thực (Authorization). - Body: Dữ liệu thực tế gửi lên (chủ yếu dùng cho POST, PUT, PATCH dưới định dạng JSON).
2. Các HTTP Method phổ biến (RESTful API)
Trong thiết kế RESTful API, mỗi phương thức HTTP ánh xạ tương ứng với một thao tác CRUD trên tài nguyên:| Method | Thao tác CRUD | Ý nghĩa | Ví dụ Endpoint |
|---|---|---|---|
| GET | Read (Đọc) | Lấy thông tin tài nguyên (không thay đổi dữ liệu trên server). | GET /products (Lấy tất cả) |
| POST | Create (Tạo) | Tạo mới một tài nguyên. | POST /products (Gửi kèm Body) |
| PATCH | Update (Sửa) | Cập nhật một phần dữ liệu của tài nguyên đã tồn tại. | PATCH /products/1 (Chỉ cập nhật giá) |
| PUT | Update (Sửa) | Thay thế toàn bộ dữ liệu của tài nguyên. | PUT /products/1 (Thay thế tất cả trường) |
| DELETE | Delete (Xóa) | Xóa bỏ một tài nguyên. | DELETE /products/1 (Xóa sản phẩm 1) |
3. Mã trạng thái HTTP (Status Codes) cốt lõi
Server sử dụng các mã số tiêu chuẩn để phản hồi nhanh trạng thái của request:- 200 OK / 201 Created: Yêu cầu thành công (201 dùng khi tạo mới dữ liệu thành công).
- 400 Bad Request: Dữ liệu gửi lên không hợp lệ (ví dụ: sai định dạng JSON, thiếu trường bắt buộc).
- 401 Unauthorized: Yêu cầu chưa được xác thực (chưa đăng nhập hoặc token không hợp lệ).
- 403 Forbidden: Đã xác thực nhưng tài khoản không có quyền truy cập tài nguyên này.
- 404 Not Found: Tài nguyên yêu cầu không tồn tại trên hệ thống.
- 500 Internal Server Error: Lỗi phát sinh từ phía Server (bug trong code, lỗi kết nối DB).
4. Xác thực & Phân quyền (Authentication & Authorization)
Bảo mật là yếu tố sống còn của Backend.- Xác thực (Authentication - AuthN): Xác định danh tính người dùng là ai (thường qua Đăng nhập bằng Email/Password).
- Phân quyền (Authorization - AuthZ): Xác định người dùng đó có được phép làm gì (ví dụ: chỉ Admin mới được xóa sản phẩm).
- Người dùng gửi thông tin đăng nhập thành công.
- Server tạo ra một chuỗi mã hóa ký số bí mật gọi là Token (JWT) và trả về cho Client.
- Ở những Request sau, Client đính kèm Token này vào Header:
- Server giải mã Token này để nhận biết danh tính người dùng mà không cần truy vấn lại cơ sở dữ liệu.
Các bước thực hiện bằng Claude Code
Thay vì phải tự viết từng dòng code, bạn có thể đóng vai trò là “Kiến trúc sư” và sử dụng Claude Code để thực thi việc viết mã nguồn. Dưới đây là quy trình từng bước ra lệnh cho Claude Code xây dựng hệ thống CRUD hoàn chỉnh.Bước 1: Cài đặt các thư viện cơ sở dữ liệu
Hãy ra lệnh cho Claude Code cài đặt các thư viện cần thiết để sử dụng SQLite và TypeORM trong NestJS:Prompt yêu cầu Claude Code:Claude Code sẽ tự động đề xuất và chạy các lệnh (sau khi bạn xác nhận đồng ý):
Bước 2: Cấu hình Kết nối Cơ sở dữ liệu
Yêu cầu Claude Code thiết lập cấu hình kết nối SQLite trong module gốc Mã nguồn sau khi Claude Code chỉnh sửa trong
app.module.ts.Prompt yêu cầu Claude Code:src/app.module.ts sẽ tương đương:Bước 3: Khởi tạo module sản phẩm (Products)
Yêu cầu Claude Code sử dụng Nest CLI để sinh cấu trúc thư mục chuẩn cho module quản lý sản phẩm.Prompt yêu cầu Claude Code:Claude Code sẽ thực hiện lệnh terminal:
Bước 4: Định nghĩa thực thể Product (Entity)
Yêu cầu Claude Code thiết kế bảng sản phẩm vật lý thông qua định nghĩa Entity.Prompt yêu cầu Claude Code:Đoạn mã
src/products/entities/product.entity.ts mà Claude Code tạo ra:Bước 5: Tạo DTOs và cấu hình Validation toàn cục
Yêu cầu Claude Code thiết lập các đối tượng truyền dữ liệu (DTO) để kiểm soát dữ liệu đầu vào chặt chẽ.Prompt yêu cầu Claude Code:Đoạn mã cấu hình
src/main.ts của Claude Code sau yêu cầu:Bước 6: Viết logic xử lý trong Service
Yêu cầu Claude Code hiện thực hóa các chức năng nghiệp vụ truy vấn cơ sở dữ liệu trong Service.Prompt yêu cầu Claude Code:Đoạn mã logic nghiệp vụ trong
src/products/products.service.ts do Claude Code xây dựng:Kiểm thử các API Endpoint bằng Claude Code
Bạn có thể yêu cầu Claude Code khởi chạy máy chủ phát triển và thực hiện kiểm thử tự động trực tiếp trên terminal: Prompt yêu cầu kiểm thử hệ thống:npm run start:dev và thực hiện các lệnh gọi cURL dưới nền để báo cáo kết quả chi tiết cho bạn!
Kiểm thử các API Endpoint bằng Postman (Giao diện trực quan)
Nếu muốn tự mình kiểm tra và quan sát trực quan dữ liệu phản hồi, bạn hãy sử dụng phần mềm Postman theo các bước hướng dẫn chi tiết dưới đây.Bước 1: Khởi tạo Collection trong Postman
- Mở Postman, chọn thẻ Collections ở thanh menu bên trái.
- Nhấp chuột vào biểu tượng dấu cộng
+để tạo mới một Collection và đặt tên làMy First NestJS CRUD.
Bước 2: Tạo Request thêm mới sản phẩm (POST)
- Nhấp chuột phải vào Collection vừa tạo, chọn Add Request.
- Đổi tên request thành
Create Product. - Chọn phương thức là
POSTvà điền URL:http://localhost:3000/products. - Nhấp chọn thẻ Body -> Chọn kiểu dữ liệu là raw -> Định dạng là JSON và dán nội dung:
- Nhấn nút Send. Bạn sẽ nhận lại mã trạng thái
201 Createdđi kèm dữ liệu sản phẩm vừa tạo (có thêm trườngidvàcreatedAttự sinh).
Bước 3: Tạo Request lấy danh sách sản phẩm (GET)
- Chọn Add Request trong Collection của bạn, đặt tên là
Get All Products. - Chọn phương thức là
GETvà điền URL:http://localhost:3000/products. - Nhấn Send và xem danh sách toàn bộ sản phẩm trả về dưới dạng một mảng JSON dưới phần Response.
Bước 4: Tạo Request cập nhật sản phẩm (PATCH)
- Chọn Add Request, đặt tên là
Update Product. - Chọn phương thức là
PATCHvà điền URL với ID của sản phẩm cần sửa (ví dụ sản phẩm số 1):http://localhost:3000/products/1. - Chọn thẻ Body -> raw -> JSON và điền nội dung thay đổi:
- Nhấn Send và kiểm tra xem thông tin sản phẩm đã được cập nhật thành công với mã phản hồi
200 OK.
Bước 5: Tạo Request xóa sản phẩm (DELETE)
- Chọn Add Request, đặt tên là
Delete Product. - Chọn phương thức là
DELETEvà điền URL của sản phẩm cần xóa:http://localhost:3000/products/1. - Nhấn Send để thực hiện lệnh xóa. Bạn sẽ thấy CSDL cập nhật và sản phẩm đó không còn xuất hiện khi chạy lại request lấy danh sách.