1# Request Body { #request-body }234Cuando necesitas enviar datos desde un cliente (digamos, un navegador) a tu API, los envías como un **request body**.56Un **request** body es un dato enviado por el cliente a tu API. Un **response** body es el dato que tu API envía al cliente.78Tu API casi siempre tiene que enviar un **response** body. Pero los clientes no necesariamente necesitan enviar **request bodies** todo el tiempo, a veces solo solicitan un path, quizás con algunos parámetros de query, pero no envían un body.910Para declarar un **request** body, usas modelos de [Pydantic](https://pydantic.dev/docs/) con todo su poder y beneficios.1112/// note | Nota1314Para enviar datos, deberías usar uno de estos métodos: `POST` (el más común), `PUT`, `DELETE` o `PATCH`.1516Enviar un body con un request `GET` tiene un comportamiento indefinido en las especificaciones, no obstante, es soportado por FastAPI, solo para casos de uso muy complejos/extremos.1718Como no se recomienda, la documentación interactiva con Swagger UI no mostrará la documentación para el body cuando se usa `GET`, y los proxies intermedios podrían no soportarlo.1920///2122## Importar `BaseModel` de Pydantic { #import-pydantics-basemodel }2324Primero, necesitas importar `BaseModel` de `pydantic`:2526{* ../../docs_src/body/tutorial001_py310.py hl[2] *}2728## Crea tu modelo de datos { #create-your-data-model }2930Luego, declaras tu modelo de datos como una clase que hereda de `BaseModel`.3132Usa tipos estándar de Python para todos los atributos:3334{* ../../docs_src/body/tutorial001_py310.py hl[5:9] *}353637Al igual que al declarar parámetros de query, cuando un atributo del modelo tiene un valor por defecto, no es obligatorio. De lo contrario, es obligatorio. Usa `None` para hacerlo solo opcional.3839Por ejemplo, el modelo anterior declara un “`object`” JSON (o `dict` en Python) como:4041```JSON42{43 "name": "Foo",44 "description": "An optional description",45 "price": 45.2,46 "tax": 3.547}48```4950...dado que `description` y `tax` son opcionales (con un valor por defecto de `None`), este “`object`” JSON también sería válido:5152```JSON53{54 "name": "Foo",55 "price": 45.256}57```5859## Decláralo como un parámetro { #declare-it-as-a-parameter }6061Para añadirlo a tu *path operation*, decláralo de la misma manera que declaraste parámetros de path y query:6263{* ../../docs_src/body/tutorial001_py310.py hl[16] *}6465...y declara su tipo como el modelo que creaste, `Item`.6667## Resultados { #results }6869Con solo esa declaración de tipo en Python, **FastAPI** hará lo siguiente:7071* Leer el body del request como JSON.72* Convertir los tipos correspondientes (si es necesario).73* Validar los datos.74 * Si los datos son inválidos, devolverá un error claro e indicado, señalando exactamente dónde y qué fue lo incorrecto.75* Proporcionar los datos recibidos en el parámetro `item`.76 * Como lo declaraste en la función como de tipo `Item`, también tendrás todo el soporte del editor (autocompletado, etc.) para todos los atributos y sus tipos.77* Generar definiciones de [JSON Schema](https://json-schema.org) para tu modelo, que también puedes usar en cualquier otro lugar si tiene sentido para tu proyecto.78* Esos esquemas serán parte del esquema de OpenAPI generado y usados por las <abbr title="User Interfaces - Interfaces de usuario">UIs</abbr> de documentación automática.7980## Documentación automática { #automatic-docs }8182Los JSON Schemas de tus modelos serán parte del esquema OpenAPI generado y se mostrarán en la documentación API interactiva:8384<img src="/img/tutorial/body/image01.png">8586Y también se utilizarán en la documentación API dentro de cada *path operation* que los necesite:8788<img src="/img/tutorial/body/image02.png">8990## Soporte del editor { #editor-support }9192En tu editor, dentro de tu función, obtendrás anotaciones de tipos y autocompletado en todas partes (esto no sucedería si recibieras un `dict` en lugar de un modelo de Pydantic):9394<img src="/img/tutorial/body/image03.png">9596También recibirás chequeos de errores para operaciones de tipo incorrecto:9798<img src="/img/tutorial/body/image04.png">99100No es por casualidad, todo el framework fue construido alrededor de ese diseño.101102Y fue rigurosamente probado en la fase de diseño, antes de cualquier implementación, para garantizar que funcionaría con todos los editores.103104Incluso se hicieron algunos cambios en Pydantic para admitir esto.105106Las capturas de pantalla anteriores se tomaron con [Visual Studio Code](https://code.visualstudio.com).107108Pero obtendrías el mismo soporte en el editor con [PyCharm](https://www.jetbrains.com/pycharm/) y la mayoría de los otros editores de Python:109110<img src="/img/tutorial/body/image05.png">111112/// tip | Consejo113114Si usas [PyCharm](https://www.jetbrains.com/pycharm/) como tu editor, puedes usar el [Pydantic PyCharm Plugin](https://github.com/koxudaxi/pydantic-pycharm-plugin/).115116Mejora el soporte del editor para modelos de Pydantic, con:117118* autocompletado119* chequeo de tipos120* refactorización121* búsqueda122* inspecciones123124///125126## Usa el modelo { #use-the-model }127128Dentro de la función, puedes acceder a todos los atributos del objeto modelo directamente:129130{* ../../docs_src/body/tutorial002_py310.py *}131132## Request body + parámetros de path { #request-body-path-parameters }133134Puedes declarar parámetros de path y request body al mismo tiempo.135136**FastAPI** reconocerá que los parámetros de función que coinciden con los parámetros de path deben ser **tomados del path**, y que los parámetros de función que se declaran como modelos de Pydantic deben ser **tomados del request body**.137138{* ../../docs_src/body/tutorial003_py310.py hl[15:16] *}139140141## Request body + path + parámetros de query { #request-body-path-query-parameters }142143También puedes declarar parámetros de **body**, **path** y **query**, todos al mismo tiempo.144145**FastAPI** reconocerá cada uno de ellos y tomará los datos del lugar correcto.146147{* ../../docs_src/body/tutorial004_py310.py hl[16] *}148149Los parámetros de la función se reconocerán de la siguiente manera:150151* Si el parámetro también se declara en el **path**, se utilizará como un parámetro de path.152* Si el parámetro es de un **tipo singular** (como `int`, `float`, `str`, `bool`, etc.), se interpretará como un parámetro de **query**.153* Si el parámetro se declara como del tipo de un **modelo de Pydantic**, se interpretará como un **body** de request.154155/// note | Nota156157FastAPI sabrá que el valor de `q` no es requerido debido al valor por defecto `= None`.158159El `str | None` no es utilizado por FastAPI para determinar que el valor no es requerido, sabrá que no es requerido porque tiene un valor por defecto de `= None`.160161Pero agregar las anotaciones de tipos permitirá que tu editor te brinde un mejor soporte y detecte errores.162163///164165## Sin Pydantic { #without-pydantic }166167Si no quieres usar modelos de Pydantic, también puedes usar parámetros **Body**. Consulta la documentación para [Body - Múltiples parámetros: Valores singulares en el body](body-multiple-params.md#singular-values-in-body).
Findings
✓ No findings reported for this file.