spanish traslation for body-multiple-params.md

This commit is contained in:
Anthony Cepeda 2021-05-14 21:19:14 +02:00
parent 33305965e7
commit d187d14b8e
2 changed files with 166 additions and 164 deletions

View File

@ -0,0 +1,166 @@
# Cuerpo - Múltiples Parámetros
Ahora que ya hemos visto cómo utilizar `Path` y `Query`, vamos a ver usos más avanzados de declaraciones de peticiones con cuerpo.
## Mezclando `Path`, `Query` y parámetros en el cuerpo
Primero, por supuesto que puedes mezclar `Path`, `Query` y declaraciones de parámetros en el cuerpo de una petición libremente y **FastAPI** sabrá qué hacer.
Al igual que también puedes declarar parámetros en el cuerpo opcionales, indicando `None` como valor por defecto:
```Python hl_lines="19-21"
{!../../../docs_src/body_multiple_params/tutorial001.py!}
```
!!! note
Ten en cuenta que en este caso, el campo `item` del cuerpo de la petición, es opcional. Ya que contiene `None` como valor por defecto.
## Múltiples parámetros en el cuerpo
En los ejemplos anteriores, las <abbr title="path operation">operaciones en rutas</abbr> estarían esperando un <abbr title="JSON body">cuerpo JSON</abbr> con atributos de `Item`, como:
```JSON
{
"name": "Foo",
"description": "The pretender",
"price": 42.0,
"tax": 3.2
}
```
Además podrías declarar múltiples parámetros en el cuerpo, por ejemplo: `item` y `user`:
```Python hl_lines="22"
{!../../../docs_src/body_multiple_params/tutorial002.py!}
```
En este caso, **FastAPI** se dará cuenta de que hay más de un parámetro en el cuerpo dentro de la función (dos parámetros que son modelos de Pydantic).
Entonces, se utilizarán los nombres de los parámetros como <abbr title=keys>claves</abbr> en el cuerpo, y se esperará un cuerpo como este:
```JSON
{
"item": {
"name": "Foo",
"description": "The pretender",
"price": 42.0,
"tax": 3.2
},
"user": {
"username": "dave",
"full_name": "Dave Grohl"
}
}
```
!!! note
Ten en cuenta que aunque `item` fue declarado de la misma forma que anteriormente, ahora se espera que se encuentre dentro del cuerpo con la <abbr title=keys>clave</abbr> `item`.
**FastAPI** hará la conversión automáticamente desde la petición, entonces el parámetro `item` al igual que `user`, recibirán ambos su contenido específico.
Se realizará la validación de los datos compuestos, y será documentado de esa forma en el esquema de OpenAPI y en la documentación automática.
## Valores singulares en el cuerpo
De la misma forma que existem `Query` y `Path` para definir información adicional para la ruta y los parámetros, **FastAPI** proporciona un `Body` equivalente.
Por ejemplo, ampliando el modelo anterior, podrías decidir que te gustaría tener la <abbr title=key>clave</abbr> `importance` en el mismo cuerpo, además de `item` y `user`.
Si lo declaras de esta forma, debido a que es un valor singular, **FastAPI** asumirá que se trata de un <abbr title="query parameter">parámetro en la consulta</abbr>.
También puedes enseñar a **FastAPI** a tratarlo como otra clave del cuerpo usando `Body`:
```Python hl_lines="23"
{!../../../docs_src/body_multiple_params/tutorial003.py!}
```
En este caso, **FastAPI** esperará un cuerpo como este:
```JSON
{
"item": {
"name": "Foo",
"description": "The pretender",
"price": 42.0,
"tax": 3.2
},
"user": {
"username": "dave",
"full_name": "Dave Grohl"
},
"importance": 5
}
```
Nuevamente, los tipos de datos serán convertidos, validados, documentados, etc.
## Múltiples parámetros en el cuerpo y consulta
Podrías también declarar parámetros adicionales de consulta en cualquier parte que lo necesites, además de los parámetros en el cuerpo.
Ya que los valores singulares son interpretados como parámetros de consulta, no tienes que añadir `Query` de forma explícita, sino que solo tienes que hacer:
```Python
q: Optional[str] = None
```
como en:
```Python hl_lines="27"
{!../../../docs_src/body_multiple_params/tutorial004.py!}
```
!!! info
`Body` al igual que `Query`, `Path` y otros que verás mas adelante, también tiene todas las validaciones adicionales y parámetros de metadatos.
## Incrustar un parámetro en el cuerpo
Digamos que tienes un solo parámetro en el cuerpo `item` del modelo de Pydantic `Item`.
Por defecto, **FastAPI** esperará el cuerpo directamente.
Pero si prefieres utilizar un JSON con una <abbr title=key>clave</abbr> dentro del contenido del modelo, al igual que se hace cuando declaras un parámetro adicional en el cuerpo, puedes usar el parámetro especial `embed` de `Body`:
```Python
item: Item = Body(..., embed=True)
```
como en:
```Python hl_lines="17"
{!../../../docs_src/body_multiple_params/tutorial005.py!}
```
En este caso **FastAPI** esperará un cuerpo como este:
```JSON hl_lines="2"
{
"item": {
"name": "Foo",
"description": "The pretender",
"price": 42.0,
"tax": 3.2
}
}
```
En lugar de:
```JSON
{
"name": "Foo",
"description": "The pretender",
"price": 42.0,
"tax": 3.2
}
```
## Recap
Puedes añadir a la <Abrr title="path operation function">función de operación en ruta</abbr> mútiples parámetros en el cuerpo, incluso aunque una petición pueda contener solo un cuerpo.
Sin embargo, **FastAPI** lo procesará, pasará los datos correctos a la función, validará y documentará el esquema correcto en la <Abrr title=path operation function>ruta de la operación</abbr>.
También puedes declarar valores singulares que serán recibidos como parte del cuerpo.
Y puedes pedir a **FastAPI** que incruste el cuerpo en la <Abrr title=key>clave</abbr>, incluso cuando haya un solo parámetro declarado.

View File

@ -1,164 +0,0 @@
# Cuerpo de la Petición (Request Body)
Cuando tienes que enviar datos desde un cliente (un navegador, por ejemplo) a tu API, lo haces en el cuerpo de la petición (**request body**).
Cuando hablamos del cuerpo de una petición (**request body**), nos referimos a los datos que se envían tanto desde el cliente hacia tu API como desde tu API al cliente.
Si bien en la mayoría de los casos tu API requiere enviar peticiones con los datos en el cuerpo (**request body**), en el caso de los clientes, no tiene por qué ser así.
Para declarar una petición datos en el cuerpo (**request body**), tienes que usar los modelos de <a href="https://pydantic-docs.helpmanual.io/" class="external-link" target="_blank">Pydantic</a>, los cuales son muy podersos y de gran ayuda.
!!! info
Para enviar datos, deberás usar uno de los siguentes métodos:`POST` (el metódo más común), `PUT`, `DELETE` o `PATCH`.
Aunque el envío de datos en el cuerpo de una petición (**request body**) usando un método `GET` tiene un comportamiento inesperado según las especificaciones HTTP, FastAPI permite dicha acción para casos extremadamente complejos.
Debido a que el envío de datos en el cuerpo de una petición en métodos `GET` es una acción no recomendada, por lo que la documentación interactiva del Swagger UI no mostrará dicha opción, con el fin de evitar posibles incompatibilidades.
## Importa `BaseModel` desde Pydantic
Primero, necesitarás importar `BaseModel` desde `pydantic`:
```Python hl_lines="4"
{!../../../docs_src/body/tutorial001.py!}
```
## Crea un modelo de datos
Debes declarar tu modelo de datos como una clase que hereda de `BaseModel`.
Utiliza los tipos de datos estándar de Python para los atributos:
```Python hl_lines="7-11"
{!../../../docs_src/body/tutorial001.py!}
```
Tendrás que hacer lo mismo a la hora de declarar los parametros de una consulta (query). Cuando un atributo de un modelo tiene un valor por defecto, no es obligatorio declararlo. Puedes usar `None` para hacer que sea opcional.
Por ejemplo, este modelo declara un objeto JSON (JSON "`object`") o un diccionario de Python (Python `dict`):
```JSON
{
"name": "Foo",
"description": "An optional description",
"price": 45.2,
"tax": 3.5
}
```
...como `description` y `tax` son opcionales (con valor por defecto `None`), el siguiente objeto JSON (JSON "`object`") debería ser válido:
```JSON
{
"name": "Foo",
"price": 45.2
}
```
## Declaración de parámetros
Para añadir como parámetro la ruta de operación (_path operation_) , puedes hacerlo de la misma forma en la que has declarado los parámetros de ruta (path) y consulta (query):
```Python hl_lines="18"
{!../../../docs_src/body/tutorial001.py!}
```
...y declara el tipo `Item` igual que el modelo que has creado anteriormente.
## Resultados
Solo con las declaraciones de tipos de Python, **FastAPI** realizará las siguientes acciones:
- Leer el cuerpo de una consulta como JSON.
- Convertir (en caso de ser necesario), los tipos correspondientes.
- Validar datos.
- Si los datos no son válidos, se devolverá un error claro y preciso, indicando exactamente dónde y cuál es el dato incorrecto.
- Tener disponibles los datos recibidos en el parámetro `item`.
- Como has declarado el parámetro en la función para que sea de tipo `Item`, además contarás con ayuda en tu editor (autocompletado, etc) para todos los atributos y sus tipos.
- Generar las definiciones en un <a href="https://json-schema.org" class="external-link" target="_blank">Esquema JSON</a> para tu modelo, que también puedes utilizar en cualquier otra parte que tenga sentido dentro de tu proyecto.
- Estos esquemas formarán parte de los esquemas generados por OpenAPI, y que ademas serán incorporados de forma automática en la documentación <abbr title="Interfaces de Usuarios">UIs</abbr>.
## Documentación automática
Los esquemas JSON de tus modelos serán parte del esquema generado por OpenApi, y serán mostrados en la documentación interactiva de API Docs:
<img src="/img/tutorial/body/image01.png">
Y además, se utilizarán en cada ruta de operación (_path operation_) que sea necesaria:
<img src="/img/tutorial/body/image02.png">
## Ayuda del Editor
En tu editor, dentro de todas tus funciones, tendrás autocompletado y ayuda con los tipos (Type hints). Esto no sería posible si en lugar del modelo de Pydantic, hubiéramos utilizado un dictionario (`dict`):
<img src="/img/tutorial/body/image03.png">
Además, tendrás señalamiento de errores para las operaciones que sean incorrectas:
<img src="/img/tutorial/body/image04.png">
No se trata de una casualidad, **FastAPI** ha sido construido entorno a este diseño.
Y ha sido probado a fondo durante la etapa de diseño, antes de realizar cualquier implementación, con el fin de asegurar que funcionará en todos los editores.
Para conseguir esto, incluso ha sido necesario realizar cambios en Pydantic.
Las capturas de pantalla anteriormente mostradas han sido obtenidas de<a href="https://code.visualstudio.com" class="external-link" target="_blank">Visual Studio Code</a>.
Sin embargo, todas las funcionalidades son completamente compatibles con <a href="https://www.jetbrains.com/pycharm/" class="external-link" target="_blank">PyCharm</a> y la mayoría de editores para Python:
<img src="/img/tutorial/body/image05.png">
!!! tip
Si estás utilizando <a href="https://www.jetbrains.com/pycharm/" class="external-link" target="_blank">PyCharm</a> como editor, puedes usar el<a href="https://github.com/koxudaxi/pydantic-pycharm-plugin/" class="external-link" target="_blank">Plugin de Pydantic para PyCharm</a>.
El uso de los modelos Pydantic mejoran la ayuda del editor en:
* autocompletado
* verificación de tipos
* refactorización
* búsquedas
* inspecciones
## Uso del modelo
Tendrás acceso a todos los atributos del objecto del modelo desde dentro de la función:
```Python hl_lines="21"
{!../../../docs_src/body/tutorial002.py!}
```
## Cuerpo de la Petición (Request body) + parámetros de ruta (Path)
Puedes declarar al mismo tiempo parámetros de ruta y peticiones con datos en el cuerpo (**request body**)
**FastAPI** reconocerá tanto los parámetros de la función que deban ser **obtenidos desde la ruta (Path)**, así como aquellos parámetros que deban formar parte del modelo de Pydantic y que tengan que **obtenerse del cuerpo de la petición (Request Body)**
```Python hl_lines="17-18"
{!../../../docs_src/body/tutorial003.py!}
```
## Cuerpo de la Petición (Request body) + ruta (Path) + parámetros de consulta (Query)
También puedes declarar al mismo tiempo, parámetros de cuerpo (**body**), ruta (**path**) y consulta (**query**)
**FastAPI** reconocerá cada uno de ellos y recogerá los datos del sitio correcto.
```Python hl_lines="18"
{!../../../docs_src/body/tutorial004.py!}
```
Los parámetros de la función serán reconocidas de la siguente forma:
- Si el parámetro está declarado en la ruta (**path**), será utilizado como parámetro de ruta.
- Si el parámetro es un **tipo singular**, como entero (`int`), decimal (`float`), cadena de caracteres (`str`), booleano (`bool`), etcétera) serán interpretados como consulta (**query**)
- Si el parámetro ha sido declarado como **modelo Pydantic**, será interpretado como petición con cuerpo (**Request body**).
!!! note
FastAPI sabrá que el valor de `q` no es obligatorio, porque su valor por defecto es `= None`.
En las cadenas de caracteres (`str`), `Optional` no es utilizado por FastAPI `Optional[str]`, pero su uso mejora la experiencia de usuario en tu editor a la hora de detectar errores.
## Sin Pydantic
Si no deseas usar los modelos de Pydantic, puedes usar directamente parámetros en el cuerpo (**Body**). Echa un vistazo a [Body - Parámetros Múltiples: Valores Singulares en el cuerpo](body-multiple-params.md#singular-values-in-body){.internal-link target=\_blank}.