On this page
รับ Request & Validation
รับ query parameter และ request body พร้อมตรวจสอบข้อมูลอัตโนมัติด้วย Pydantic
API ต้องรับข้อมูลจากผู้เรียก ทั้งผ่าน URL (query) และเนื้อหา request (body) FastAPI ใช้ Pydantic ตรวจสอบข้อมูลให้อัตโนมัติ ทำให้ไม่ต้องเขียน validate เองทุกฟิลด์
Query parameter
@app.get("/search")
def search(q: str, limit: int = 10): # q จำเป็น, limit มี default
return {"query": q, "limit": limit}
# GET /search?q=python&limit=5
# -> {"query": "python", "limit": 5}Request body ด้วย Pydantic model
สำหรับ POST/PUT เรานิยามรูปแบบข้อมูลด้วย Pydantic model (คล้าย dataclass จากบท 2) FastAPI จะ validate ให้อัตโนมัติว่า body ตรงรูปแบบ
from fastapi import FastAPI
from pydantic import BaseModel, Field
app = FastAPI()
class UserCreate(BaseModel):
name: str
age: int = Field(gt=0, lt=150) # ต้อง 0 < age < 150
email: str
@app.post("/users", status_code=201)
def create_user(user: UserCreate): # FastAPI parse + validate ให้
return {"created": user.name, "age": user.age}
# ส่ง body ที่ age=200 -> error 422 อัตโนมัติ (ไม่ผ่าน validation)validation อัตโนมัติ + error ชัดเจน
ถ้าข้อมูลไม่ตรงรูปแบบ FastAPI ตอบ 422 พร้อมบอกว่า field ไหนผิดเพราะอะไร — ไม่ต้องเขียน if ตรวจเอง
POST /users body: {"name": "Aph", "age": 200, "email": "x"}
-> 422 Unprocessable Entity
{"detail": [{"loc": ["body", "age"], "msg": "ensure value is less than 150"}]}นี่คือหลัก defensive programming (บท 2) ในโลกเว็บ — input จากภายนอกเชื่อไม่ได้ ต้อง validate เสมอ Pydantic + FastAPI ทำให้ validation เป็นเรื่องง่ายและประกาศชัดในตัว model
สรุปหัวข้อนี้
- query param: รับผ่านพารามิเตอร์ฟังก์ชัน (มี default = optional)
- request body: นิยาม Pydantic BaseModel แล้วรับเป็นพารามิเตอร์
- Field(gt=, lt=, ...) ใส่กฎ validation; FastAPI ตอบ 422 อัตโนมัติถ้าผิด
- เป็น defensive programming ฝั่งเว็บ — validate input เสมอ
1) สร้าง endpoint /search รับ q และ limit 2) นิยาม Pydantic model สำหรับสร้าง product (name, price>0) 3) สร้าง POST /products ที่ validate ด้วย model 4) ลองส่ง price ติดลบแล้วดู error 422