FastAPI Solicitudes y Respuestas
En FastAPI, la solicitud (Request) y la respuesta (Response) son el núcleo de la interacción con el cliente.
FastAPI proporciona potentes herramientas para analizar los datos de solicitud y generar respuestas normalizadas según sea necesario.

A continuación, veamos en detalle las solicitudes y respuestas de FastAPI.
Puede consultar el contenido relacionado con HTTP:Métodos de solicitud HTTP。
Datos de solicitud
Parámetros de consulta
En el siguiente ejemplo definimos una/items/ruta, que acepta dos parámetros de consultaskipylimit, sus tipos son enteros, y los valores predeterminados son respectivamente0y10。
Ejemplo
app = FastAPI()
@app.get("/items/")
def read_item(skip: int = 0, limit: int = 10):
return {"skip": skip, "limit": limit}
Ejecute el siguiente comando en la línea de comandos para iniciar la aplicación:
uvicorn main:app --reload
Ahora, abra el navegador y acceda ahttp://127.0.0.1:8000/items/, se devolvieron los datos JSON predeterminados:

PaseGETlos parámetros de la solicitudhttp://127.0.0.1:8000/items/?skip=1&limit=5, los datos JSON devueltos son los siguientes:

Parámetros de ruta
Podemos configurar los parámetros en la ruta, de modo que la URL se vea más elegante.
En el siguiente ejemplo definimos una con un parámetro de rutaitem_idy un parámetro de consultaqla ruta.
Ejemplo
app = FastAPI()
@app.get("/items/{item_id}")
def read_item(item_id: int, q: str = None):
return {"item_id": item_id, "q": q}
PaseGETlos parámetros de la solicitudhttp://127.0.0.1:8000/items/5/?q=ejemplo, los datos JSON devueltos son los siguientes:

Cuerpo de la solicitud
A continuación, creamos una/items/ruta, utilizando@app.postun decorador que indica que esta es una ruta para manejarPOSTsolicitudes.
Ejemplo
from fastapi import FastAPI
app = FastAPI()
class Item(BaseModel):
name: str
description: str = None
price: float
tax: float = None
@app.post("/items/")
def create_item(item: Item):
return item
Usando el modelo Pydantic Item se define un cuerpo de solicitud, que contiene múltiples campos, algunos de los cuales tienen valores predeterminados. Para más información sobre Pydantic, consulte:Modelo Pydantic de FastAPI。
A continuación, podemos abrirhttp://127.0.0.1:8000/docspara realizar la prueba POST:
Complete los parámetros de la solicitud:

El resultado devuelto es el siguiente:

Datos de respuesta
Devolver datos JSON
La función de manejo de la ruta devuelve un diccionario, que FastAPI convertirá automáticamente a formato JSON y enviará al cliente como respuesta:
Ejemplo
app = FastAPI()
@app.get("/items/")
def read_item(skip: int = 0, limit: int = 10):
return {"skip": skip, "limit": limit}
El código anterior, al acceder en el navegador ahttp://127.0.0.1:8000/items/, devolvió los datos JSON:

Devolver modelo Pydantic
La función de manejo de la ruta devuelve una instancia del modelo Pydantic; FastAPI la convertirá automáticamente a formato JSON y la enviará al cliente como respuesta:
Ejemplo
from fastapi import FastAPI
app = FastAPI()
class Item(BaseModel):
name: str
description: str = None
price: float
tax: float = None
@app.post("/items/")
def create_item(item: Item):
return item
Para la solicitud POST, el formato de los datos devueltos es el siguiente:
{
"name": "ejemplo",
"description": "Ejemplo POST 测试",
"price": 12,
"tax": 1
}
Cabeceras de solicitud y cookies
Utilice las anotaciones de tipo Header y Cookie para obtener los datos de las cabeceras de solicitud y las cookies.
Ejemplo
from fastapi import FastAPI
app = FastAPI()
@app.get("/items/")
def read_item(user_agent: str = Header(None), session_token: str = Cookie(None)):
return {"User-Agent": user_agent, "Session-Token": session_token}
El código anterior, al acceder en el navegador ahttp://127.0.0.1:8000/items/, devolvió los datos JSON:

Redirecciones y códigos de estado
UtiliceRedirectResponsepara implementar la redirección, redirigiendo al cliente a/items/ruta.
Ejemplo
from fastapi import FastAPI
from fastapi.responses import RedirectResponse
app = FastAPI()
@app.get("/items/")
def read_item(user_agent: str = Header(None), session_token: str = Cookie(None)):
return {"User-Agent": user_agent, "Session-Token": session_token}
@app.get("/redirect")
def redirect():
return RedirectResponse(url="/items/")
El código anterior, al acceder en el navegador ahttp://127.0.0.1:8000/redirect/será redirigido automáticamente ahttp://127.0.0.1:8000/items/la página:

Utilice HTTPException para lanzar una excepción y devolver un código de estado personalizado y la información detallada.
En el siguiente ejemplo, enitem_idPara42se devolverá404el código de estado:
Ejemplo
app = FastAPI()
@app.get("/items/{item_id}")
def read_item(item_id: int):
if item_id == 42:
raise HTTPException(status_code=404, detail="Item not found")
return {"item_id": item_id}
El código anterior, al acceder en el navegador ahttp://127.0.0.1:8000/items/42/la página se muestra de la siguiente manera:

Cabeceras de respuesta personalizadas
UtiliceJSONResponsepara personalizar las cabeceras de respuesta:Ejemplo
from fastapi.responses import JSONResponse
app = FastAPI()
@app.get("/items/{item_id}")
def read_item(item_id: int):
content = {"item_id": item_id}
headers = {"X-Custom-Header": "custom-header-value"}
return JSONResponse(content=content, headers=headers)
El código anterior, al acceder en el navegador ahttp://127.0.0.1:8000/items/42/la página se muestra de la siguiente manera, y se pueden ver nuestras cabeceras de respuesta personalizadas:
