Path Parameters

Define path parameters with type hints:

from fastapi import FastAPI

app = FastAPI()

@app.get("/users/{user_id}")
def get_user(user_id: int):
    return {"user_id": user_id}

@app.get("/items/{item_id}/{category}")
def get_item(item_id: int, category: str):
    return {"item_id": item_id, "category": category}

Query Parameters

Handle query parameters:

from typing import Optional

@app.get("/items/")
def read_items(
    skip: int = 0,
    limit: int = 10,
    q: Optional[str] = None
):
    return {
        "skip": skip,
        "limit": limit,
        "q": q
    }

# URL: /items/?skip=0&limit=20&q=search

Request Body

Handle POST requests:

from pydantic import BaseModel

class Item(BaseModel):
    name: str
    price: float
    description: Optional[str] = None

@app.post("/items/")
def create_item(item: Item):
    return item

HTTP Methods

Support different HTTP methods:

@app.get("/items/{item_id}")      # GET
@app.post("/items/")              # POST
@app.put("/items/{item_id}")      # PUT
@app.delete("/items/{item_id}")   # DELETE
@app.patch("/items/{item_id}")    # PATCH

Response Models

Define response structure:

class UserResponse(BaseModel):
    id: int
    name: str
    email: str

@app.get("/users/{user_id}", response_model=UserResponse)
def get_user(user_id: int):
    return UserResponse(id=user_id, name="Alice", email="[email protected]")

Status Codes

Set custom status codes:

from fastapi import status

@app.post("/items/", status_code=status.HTTP_201_CREATED)
def create_item(item: Item):
    return item

Best Practices

  • Use type hints: Enable automatic validation
  • Use Pydantic models: For request/response validation
  • Organize with routers: For large applications
  • Document endpoints: FastAPI auto-generates docs

Next Steps

Learn about Pydantic models for data validation, or explore dependencies.