APIs: Explicando el Overfetching y Underfetching de manera amigable.
Tags: api, webdev, beginners
Published: 2023-01-04 05:02:06

## Introducción 📜
El **overfetching** y el **underfetching** son dos problemas comúnmente considerados "errores" en el diseño de una **API** que impactan directamente en el funcionamiento de ésta.
En éste post veremos las desventajas que traen estos conceptos y sus posibles soluciones a la hora de diseñar nuestras **APIs**.

## El problema 💥
El **overfetching** es producido cuando el recurso entregado contiene más información de la que inicialmente fue solicitada. Esto supone un problema ya que es innecesariamente costoso para el servidor.

Por otra parte, el **underfetching** es todo lo contrario. Cada vez que se solicita información, la API devuelve menos datos de los que el cliente pide, es decir, proporciona información incompleta. El resultado de esto es una frustración por parte del cliente y un mayor número de peticiones para obtener el recurso completo.

## Algunas desventajas ❌
* Aumento en el número de peticiones.
* Mayor uso de recursos.
* Más complejidad en el código.
* Exposición de datos.

## Ejemplo 🔍
Imagina que estas en un restaurante a punto de hacer tu orden. Le pides al mesero una pizza de pepperoni 🍕 y esperas pacientemente a que traigan tu orden.
Esto que te acabo de decir, representa una petición al servidor en donde el **cliente **es la persona que solicita la pizza de pepperoni, la **API** es el mesero y el **servidor **es el restaurante o la cocina en su defecto.

La petición:
```
GET /api/pizza?flav=pepperoni HTTP/1.1
```
La respuesta que esperamos:
```JSON
{
  "name": "Pepperoni",
  "size": "medium",
  "ingredients": [
    "tomato sauce", 
    "mozzarella cheese",
    "pepperoni",              
  ],
}
```
Veamos como el overfetching y el underfetching dificultan la usabilidad de la API.

## Overfetching ➕
En el caso del overfetching, luego de que el cliente haya esperado pacientemente por su pizza de pepperoni, el mesero llega con la orden. Al ver la orden el cliente nota algo un tanto diferente en su tan ansiada pizza de pepperoni. Veamos que pasa:
```JSON
[
  {
    "name": "Pepperoni",
    "size": "medium",
    "ingredients": [
      "tomato sauce", 
      "mozzarella cheese",
      "pepperoni",              
    ],
  },
  {
    "name": "Meat Lovers",
    "size": "large",
    "ingredients": [
      "tomato sauce",
      "mozzarella cheese",
      "pepperoni",
      "ham",
      "bacon",
      "sausage"
    ]
  },
  {
    "name": "Hawaiian",
    "size": "medium",
    "ingredients": [
      "tomato sauce",
      "mozzarella cheese",
      "ham",
      "pineapple"
    ]
  },
  {
    "name": "Vegetarian",
    "size": "small",
    "ingredients": [
      "tomato sauce",
      "mozzarella cheese",
      "mushrooms",
      "bell peppers",
      "onions"
    ]
  },
]
```
¿Qué ha pasado? La pizza de pepperoni llegó acompañada de otras 3 pizzas. El cliente solo necesita la información sobre la pizza de pepperoni, pero el mesero ha traído toda la información disponible sobre todas las pizzas. Esto puede resultar muy costoso ya que puede requerir más tiempo para procesar y transmitir la información innecesaria, lo que puede aumentar el tiempo de respuesta de la API y disminuir la velocidad de la aplicación.

## Underfetching ➖
Para el underfetching, el cliente ha esperado por su orden pero cuando ve llegar al mesero, nota que solo trae una porción de la pizza. Veamos:
````JSON
{
  "name": "Pepperoni",
  "size": "slice",
},
```
Esta porción ni siquiera tiene ingredientes! El cliente pidió una pizza de pepperoni pero el mesero solo ha traído una porción sin ingredientes. Esto logra frustrar al cliente ya que solicitó un recurso pero éste fue entregado de manera incompleta, ahora deberá seguir realizando peticiones. Esta dificultad a la hora de usar nuestra API puede provocar una mayor cantidad de solicitudes para obtener toda la información necesaria, lo que puede aumentar la carga en el servidor y disminuir la eficiencia del sistema.

## Posibles soluciones 🤔
Para mitigar estos problemas aquí tienes algunos consejos que puedes seguir a la hora de diseñar una API:

1. **Documenta** tu API: Puedes minimizar el underfetching y el underfetching ayudando a los desarrolladores a entender como funciona tu API documentándola de forma correcta.
2. Mejorar la **arquitectura** de la API: Puedes intentar diseñar las rutas y el acceso a los recursos de una mejor manera siguiendo buenas prácticas.
3. **DTOs**: Utiliza DTOs (Data Transfer Objects) para controlar qué información es enviada y recibida.
4. **GraphQL**: Puedes utilizar GraphQL para que tus clientes puedan solicitar solo la información necesaria.

---

Muchas gracias por llegar hasta aquí, espero que hayas comprendido lo que he escrito en este post.

#### Sígueme si te ha sido de ayuda! 😸