Thời lượng: 25 phút
Level: Beginner
Yêu cầu: Kiến thức cơ bản về REST API
Mục tiêu bài học
Sau bài học này, bạn sẽ:
- Phân biệt được Code-First và Contract-First development.
- Hiểu được lợi ích của việc thống nhất Spec trước khi code.
- Biết cách sử dụng OpenAPI (Swagger) làm Single Source of Truth.
Nội dung chính
1. Code-First vs Contract-First
Trong phát triển API, có hai trường phái tiếp cận chính:
| Đặc điểm | Code-First | Contract-First |
|---|---|---|
| Quy trình | Viết code → Generate tài liệu | Viết Spec (YAML/JSON) → Viết code |
| Tốc độ bắt đầu | Nhanh (với Developer) | Chậm hơn một chút (cần họp bàn) |
| Tính thống nhất | Thường bị sai lệch khi code thay đổi | Luôn là Single Source of Truth |
| Phối hợp FE/BE | FE phải đợi BE code xong mới biết data | FE và BE làm việc song song dựa trên Spec |
2. Tại sao Contract-First là "Xương sống" của Design System?
Backend Design System hướng tới sự nhất quán. Nếu mỗi developer tự viết code rồi mới generate spec, sự nhất quán sẽ phụ thuộc vào kỷ luật cá nhân.
Contract-First ép buộc sự nhất quán:
- Thảo luận trước: Team FE và BE chốt data format trước khi tốn công code.
- Mocking: FE có thể dùng mock server (như Prism) để chạy ngay lập tức.
- Validation: Có thể dùng tool để kiểm tra xem code thực tế có chạy đúng như Spec đã hứa không.
3. Công cụ: OpenAPI Specification (OAS)
OpenAPI (tên cũ là Swagger) là tiêu chuẩn công nghiệp để định nghĩa API.
# Ví dụ một phần của OpenAPI Spec
openapi: 3.0.0
info:
title: User Service API
version: 1.0.0
paths:
/users/{id}:
get:
summary: Lấy thông tin user theo ID
parameters:
- name: id
in: path
required: true
schema:
type: string
responses:
'200':
description: Thành công
content:
application/json:
schema:
$ref: '#/components/schemas/UserResponse'Nguyên tắc then chốt
"Spec là nguồn sự thật duy nhất. Code chỉ là bản thực thi của Spec."
Nếu Spec và Code khác nhau, Code là sai (mặc dù nó có thể đang chạy). Mọi thay đổi về Data Format đều phải bắt đầu từ việc cập nhật Spec và được Review bởi các Stakeholders.
Thực hành
Bài tập 1: Thiết kế Spec cho tính năng "Tạo đơn hàng"
Bối cảnh: Bạn cần thiết kế API cho phép người dùng tạo đơn hàng mới.
Yêu cầu:
- Định nghĩa URL path (VD:
/orders) - Định nghĩa Request Body (cần có
items,total_price) - Định nghĩa mã lỗi khi hết hàng (400 Bad Request)
Gợi ý:
Xem gợi ý OpenAPI
paths:
/orders:
post:
requestBody:
content:
application/json:
schema:
type: object
properties:
items:
type: array
total_price:
type: numberTình huống thực tế
Scenario 1: Frontend team phải đợi Backend
Bối cảnh: Backend dự kiến mất 1 tuần để hoàn thành API. Frontend team đang ngồi chơi vì không biết API sẽ trả về dữ liệu gì để làm giao diện.
Câu hỏi:
- Bạn sẽ làm gì để Frontend team có thể bắt đầu làm việc ngay vào ngày mai?
- Spec cần đạt mức độ chi tiết nào để FE có thể mock dữ liệu chính xác?
Xem phân tích
Phân tích:
- Sử dụng Contract-First. Dành 2 tiếng để họp và viết file YAML/JSON định nghĩa API.
- Cung cấp file YAML này cho FE. FE sử dụng các tool như
prismhoặcstoplightđể chạy Mock Server. - FE coi Mock Server là API thật và code giao diện. Khi BE xong, chỉ cần đổi URL gốc là mọi thứ khớp 100%.
Câu hỏi phỏng vấn
Junior Level
- Q: OpenAPI là gì? A: Là một tiêu chuẩn (specification) dùng để mô tả RESTful API dưới dạng file YAML hoặc JSON, giúp con người và máy móc đều hiểu được mà không cần xem source code.
Senior Level
- Q: Làm sao để đảm bảo Code luôn tuân thủ Contract trong môi trường Agile thay đổi nhanh? A: Sử dụng Contract Testing. Tích hợp các tool như Dredd hoặc Prism vào CI/CD để validate integration tests. Nếu code trả về format khác Spec, build sẽ fail.
Tóm tắt
Những điều cần nhớ
| Bước | Hành động |
|---|---|
| 1. Design | Viết file Spec (Swagger/OAS) |
| 2. Review | FE, BE, QA duyệt Spec |
| 3. Mock | FE làm việc với Mock Server |
| 4. Implement | BE viết code theo đúng Spec |
Bước tiếp theo
Bài tiếp theo: Lesson 2.2: Response Envelope - Tìm hiểu cách đóng gói dữ liệu trả về một cách chuyên nghiệp và nhất quán.