API Intro: từ zero hiểu "đối thoại giữa program"
Core
API là gì? Như: thiết kế menu nhà hàng sao khách nhìn hiểu? Phục vụ ghi order sao không sai? API giải "program đối thoại với program thế nào". Ngày đầu code bạn đã dùng API, chỉ là chưa nhận ra.
0. 3 confusion thường gặp
Confusion 1: API là thứ cao siêu?
API không khó. Bạn đã dùng:
len("hello") # API của Python
open("file.txt") # API
requests.get(url) # APIConfusion 2: Web API vs API thường khác gì?
| Type | Calling | Communication | Use |
|---|---|---|---|
| Function API | Local code | Function call | len(), open() |
| OS API | OS | System call | Read/write file, create process |
| Web API | Remote server | HTTP request | Call AI model, get weather |
Confusion 3: HTTP hay SDK?
# HTTP: tự xử mọi detail
import requests
response = requests.post(
"https://api.deepseek.com/v1/chat/completions",
headers={"Authorization": "Bearer sk-xxx"},
json={"model": "deepseek-chat", "messages": [...]}
)
result = response.json()["choices"][0]["message"]["content"]
# SDK: butler xử giúp
from openai import OpenAI
client = OpenAI(api_key="sk-xxx")
response = client.chat.completions.create(
model="deepseek-chat",
messages=[...]
)
result = response.choices[0].message.content1. Bản chất API: plug + outlet
API (Application Programming Interface) = "thoả thuận đối thoại giữa program".
1.1 Ẩn dụ thiết bị điện
| Concept | Thiết bị | API |
|---|---|---|
| Interface | Hình dáng outlet | Function signature / URL |
| Input | Dòng điện vào | Param / request body |
| Output | Thiết bị work | Return value / response body |
1.2 3 dạng API
len("hello") # 返回 5
max([1, 5, 3]) # 返回 5
open("file.txt").read() # 读取文件1.3 Function vs HTTP API
# 调用内置函数
length = len("hello") # 返回 5
# 调用库函数
import math
result = math.sqrt(16) # 返回 4.0
# 调用自定义函数
def add(a, b):
return a + b
sum = add(3, 5) # 返回 8POST /v1/chat/completions HTTP/1.1
Host: api.deepseek.com
Authorization: Bearer sk-xxx
Content-Type: application/json
{
"model": "deepseek-chat",
"messages": [
{"role": "user", "content": "你好"}
]
}1.4 Đọc doc khác loại
### json.loads(s, *, cls=None, object_hook=None...)
将 JSON 字符串解析为 Python 对象
**参数:**
- s (str): 要解析的 JSON 字符串
- cls (JSONDecoder): 自定义解码器类
- object_hook (callable): 可选的转换函数
**返回值:**
- dict | list: 解析后的 Python 对象
**异常:**
- JSONDecodeError: 字符串格式非法
**示例:**
>>> import json
>>> json.loads('{"name": "Alice"}')
{'name': 'Alice'}- 先看函数签名,了解需要什么参数
- 注意参数的类型和是否必填
- 查看返回值类型,方便后续处理
- 关注可能抛出的异常,做好错误处理
2. Full API call
HTTP Request→HTTP Response←2.1 4 stage
| Stage | Xảy ra gì | Ẩn dụ điện |
|---|---|---|
| Request | Client gửi request | Bấm switch |
| Transmission | Request qua network | Điện qua dây |
| Processing | Server xử + return | Thiết bị work |
| Response | Client nhận + xử kết quả | Đèn sáng |
2.2 Ẩn dụ nhà hàng
| Role | API | Note |
|---|---|---|
| Menu | API doc | Cho biết "món" nào order được |
| Phục vụ | HTTP protocol | Cách "đối thoại" chuẩn |
| Bếp | Server | Theo "order" xử |
| Mang món | Response | Trả kết quả |
3. HTTP methods
| Scenario | Bạn nói gì? | HTTP method |
|---|---|---|
| Muốn biết hôm nay có món gì | "Cho menu xem" | GET - chỉ "hỏi", không đổi data |
| Muốn order gà xào | "Cho 1 phần gà xào" | POST - "làm" việc, tạo data |
| Muốn đổi món | "Đổi gà xào thành cá kho" | PUT - replace data |
| Muốn đổi vị | "Gà xào không bỏ ớt" | PATCH - update partial |
| Không muốn nữa | "Bỏ món đó" | DELETE - xoá data |
GET /api/users # 获取用户列表
GET /api/users/123 # 获取单个用户
GET /api/products?cat=phone # 查询手机商品Idempotent
Idempotent: execute nhiều lần kết quả giống nhau?
- Idempotent (GET/PUT/DELETE): 10 lần và 1 lần giống nhau
- Không idempotent (POST): 10 lần có thể tạo 10 order
Solution: POST dùng unique ID verify, tránh xử lặp.
| Method | Use | Idempotent | Safe | Use |
|---|---|---|---|---|
| GET | Get | Có | Có | Query list, detail |
| POST | Create | Không | Không | New user, submit order |
| PUT | Update full | Có | Không | Replace user profile |
| PATCH | Update partial | Không | Không | Sửa nickname |
| DELETE | Delete | Có | Không | Xoá user, cancel order |
4. HTTP status codes
| Code | Nghĩa | Use | Client xử |
|---|---|---|---|
| 200 OK | Success | Request OK | Hiện data |
| 201 Created | Created | POST OK | Jump resource mới |
| 400 Bad Request | Format sai | Param thiếu hoặc format sai | Check param |
| 401 Unauthorized | No auth | Không có API Key valid | Dẫn user login |
| 403 Forbidden | No permission | API Key không quyền | Báo no permission |
| 404 Not Found | Not exist | URL hoặc resource không có | Check URL |
| 429 Too Many Requests | Quá rate limit | Vượt limit | Wait retry |
| 500 Internal Server Error | Server error | Server crash | Báo user retry sau |
5. HTTP vs SDK
| 🏃 HTTP API | 🤵 SDK | |
|---|---|---|
| Ẩn dụ | Tự chạy việc | Butler làm |
| Ưu | Mọi ngôn ngữ dùng được Control mọi detail Không depend extra | Code gọn Auto xử auth Built-in retry |
| Nhược | Phải xử mọi detail Code dài, dễ sai | Cần cài dep Có thể vấn đề version |
| Code | requests.post(url, json=..., headers={...}) | client.chat.completions.create(...) |
| Scenario | Recommend | Lý do |
|---|---|---|
| Dev nhanh | SDK | Auto xử auth, error, retry |
| Học nguyên lý | HTTP | Hiểu underlying |
| Ngôn ngữ không hỗ trợ | HTTP | Mọi ngôn ngữ dùng được |
| Cần custom | HTTP | Control mọi detail |
Khuyến nghị
Có SDK thì dùng SDK, để chuyện phiền cho lib, time cho mình.
6. Đọc API doc
API doc = manual + menu. Không cần đọc từ đầu cuối, học "tra từ điển".
6.1 Checklist đọc doc
https://api.deepseek.comPOST /v1/chat/completionsAuthorization: Bearer sk-xxx Content-Type: application/json
from openai import OpenAI
client = OpenAI(
api_key="sk-xxx",
base_url="https://api.deepseek.com"
)
response = client.chat.completions.create(
model="deepseek-chat",
messages=[{"role": "user", "content": "你好"}]
)| Item | Note | Vd |
|---|---|---|
| Base URL | Root API | https://api.deepseek.com |
| Authentication | Cách verify identity | Authorization: Bearer sk-xxx |
| Endpoints | List interface | /v1/chat/completions |
| Parameters | Required/optional | model (required), temperature (optional) |
| Response | Data structure | {"choices": [...]} |
6.2 Step đọc
- Tìm Base URL - prefix mọi request
- Hiểu auth - API Key ở Header hay Query?
- Tìm Endpoint cần - interface bạn call
- Xem param - required/optional?
- Hiểu response format - data tổ chức thế nào?
7. Thực hành: mock API
Thử trigger:
- Success: nhập đúng Endpoint + API Key
- 401: không nhập API Key, server reject thế nào?
- 404: nhập URL không tồn tại
8. Tổng kết
Key
- API = truyền tin, đưa lời từ code này → code khác / remote server
- Bạn đã dùng API, từ
len()đếnopen()đều là API - Web API = superpower, call super computer ngoài xa
- SDK = butler tốt, có SDK thì dùng
- Đọc doc tìm 3 thứ: address, auth, param
AI era, chỉ cần nhớ concept core. Detail thì IDE + AI assistant lo.
Glossary
| Term | Full | Note |
|---|---|---|
| API | Application Programming Interface | Define software interact thế nào |
| Web API | - | API based on HTTP |
| Endpoint | - | Address cụ thể của API |
| HTTP | HyperText Transfer Protocol | Web API protocol |
| SDK | Software Development Kit | Wrap underlying API call |
| URL | Uniform Resource Locator | Network address |
| JSON | JavaScript Object Notation | Common data format |
| Authentication | - | Verify identity |
| Status Code | - | HTTP response status |
| Request | - | Request |
| Response | - | Response |
| Header | - | HTTP header, metadata |
| Payload | - | Actual data |
| Rate Limit | - | Rate limit |
| Idempotent | - | Multi exec same result |
| REST | Representational State Transfer | API architecture style |
| RPC | Remote Procedure Call | Remote procedure call |
| GraphQL | - | Query language API |
| gRPC | - | Google high-perf RPC |
2026 cho VN dev
- LLM API standard: OpenAI format trở thành de-facto (Anthropic, DeepSeek, Qwen đều có endpoint OpenAI-compatible)
- API client tool: Bruno (open-source Postman), Hoppscotch (web-based), HTTPie
- API doc tool: Swagger/OpenAPI (chuẩn), Scalar (đẹp), Stoplight
- Type-safe API: tRPC (TS), Hono RPC, OpenAPI gen client
- VN API ecosystem: payment (VNPay, MoMo, ZaloPay), SMS (Esms, Viettel), eKYC (FPT.AI, VinID)