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

from fastapi import FastAPI

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

from fastapi import FastAPI

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 pydantic import BaseModel
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

from fastapi import FastAPI

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 pydantic import BaseModel
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 Header, Cookie
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 Header, Cookie
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

from fastapi import HTTPException

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 import FastAPI
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:

Otras extensiones