Notes & software courses · Free to learn
Aph's Blog
On this page

รับ Request & Validation

👋 อ่านฟรีทั้งหมดบน Aph's Blog — เนื้อหาภาษาไทย ทำตามทีละหน้าใน sidebar ได้เลย หากมีข้อเสนอแนะหรืออยากให้เพิ่มหัวข้อไหน บอกได้เสมอ

รับ query parameter และ request body พร้อมตรวจสอบข้อมูลอัตโนมัติด้วย Pydantic

API ต้องรับข้อมูลจากผู้เรียก ทั้งผ่าน URL (query) และเนื้อหา request (body) FastAPI ใช้ Pydantic ตรวจสอบข้อมูลให้อัตโนมัติ ทำให้ไม่ต้องเขียน validate เองทุกฟิลด์

Query parameter

python
@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 ตรงรูปแบบ

python
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"}]}
อย่าเชื่อ input จาก client

นี่คือหลัก 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