Cómo crear tu primera API en Python con FastAPI

Cómo crear tu primera API en Python con FastAPI
Photo by Fahim Muntashir / Unsplash

El fin de semana estuve tratando de aprender algo nuevo y así fue, escribí mi primera API en Python con FastAPI y en este artículo te muestro como hacerlo.

¿Qué es una API?

Una API es, básicamente, una forma que tienen dos o más aplicaciones para hablarse. Cuando en este blog hablamos de como usar Terraform, Ansible o cómo consumir información de diferentes servicios, lo que hacen esos programas es consumir la API del servicio en donde estamos aprovisionando esa infraestructura. Por ejemplo, Terraform, habla con la API de AWS/Azure/Digital Ocean o el que sea para crear máquinas virtuales, borrarlas, crear usuarios, establecer reglas de firewall, etc.

¿Entonces?

Entonces, vamos a crear nuestra primera API para que haga algo sencillo, como por ejemplo, responder un string, pero vamos a ver, en otro artículos, como traer datos de una base de datos o cómo hacer cosas más prácticas.

Let's Code

Lo que vamos a usar para crear nuestra primera API es FastAPI, hace que todo este proceso sea muy sencillo, este módul0 junto con Uvicorn, nos ayudará a tener nuestra primera API en minutos.

FastAPI
FastAPI framework, high performance, easy to learn, fast to code, ready for production
Uvicorn
The lightning-fast ASGI server.

Vamos a instalar estos dos componentes:

$ pip install "fastapi[all]"

Esto de acá arriba, te instala Uvicorn también.

Algo a tener en cuenta, que para este ejemplo que es muy básico, vamos a usar solo dos métodos de interación con la API, GET y POST. El primero nos va a permitir sacar info de la API y la otra, enviar info a esa API, que con esa info haga algo y nos devuelva otra cosa.

Vamos a escribir algo de código...

from fastapi import FastAPI

app = FastAPI()

@app.get("/endpoint")
async def endpoint():
    return {"message": "Esta es mi primera API"}

Lo que estamos haciendo aquí es algo muy sencillo. Le estamos diciendo que cuando hagan una llamada al /endpoint de nuestro webserver, nos devuelva este string. Probemoslo.

Para eso, en una terminal, vamos a navegar hasta la carpeta en donde guardamos nuestro codigo, recuerda hacerlo con la extension .py y vamos a levantar el webserver. Tenemos que hacerlo de la siguiente manera:

$ uvicorn main:app --reload

Noten, que aquí lo que estamos haciendo es decirle a uvicorn que lo que queremos publicar es la "app" que tenemos definida en nuestro código. Usaremos --reload para que cada vez que hagamos un cambio al código, reinicie solo el servidor. Si todo esta bien, deberemos ver algo como esto:

INFO:     Will watch for changes in these directories: ['/Users/nacho/wip/my-first-api']
INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO:     Started reloader process [88215] using watchgod
INFO:     Started server process [88219]
INFO:     Waiting for application startup.
INFO:     Application startup complete.

A partir de este momento, estamos listos para pegarle a la API, lo haremos a esta dirección: 127.0.0.1:8000/endpoint.

Como vemos en el codigo, el método que implementamos será un GET, así que eso es lo que le tenemos que mandar al endpoint. Veamos cómo hacerlo...

Abrimos otra terminal y le vamos a hacer un CURL:

$ curl -X 'GET' \
  'http://127.0.0.1:8000/endpoint' \
  -H 'accept: application/json'

Cómo en el código, lo unico que tenemos dentro de la función endpoint() es que retorne con el mensaje "Esta es mi primera API" eso es lo que veremos...

{
  "message": "Esta es mi primera API"
}

Entonces. Ya vimos como hacer un GET y que nos responda con una función bien sencilla que es respondernos con un mensaje. Ahora veamos como interactuar un poco más con la API, veremos cómo hacer un POST, que es básicamente mandarle información en JSON para que nos responda con algo. El código se ve de esta manera:

@app.post("/endpoint/{nombre}")
async def endpoint_post(nombre: str):
    return {"message": f"Hola {nombre}, estas desarrollando tu primera api"}

Noten como acá cambiamos el GET por POST y al final del endpoint estamos agregando una variable, que es la que vamos a especificar usando CURL, para que de esta manera, nos responda con lo que tenemos en el return.

$ curl -X 'POST' \
  'http://127.0.0.1:8000/endpoint/nacho' \
  -H 'accept: application/json' \
  -d ''

Esto es lo que deberias ver en la respuesta...

{
  "message": "Hola nacho, estas desarrollando tu primera api"
}

Para ir cerrando

Como ves, no es muy complicado, FastAPI lo hace bastante sencillo, por supuesto, que una API retorne un string o que nos salude no es nada útil pero dentro de esas funciones podemos hacer cosas más interesante, como por ejemplo, chequear la conexión hacia un servidor, leer datos de una base datos, almacenar datos en una base de datos entre un montón de cosas más que ya estaremos viendo en otros artículos. Les dejo el código completo a continuación. ¿Qué te pareció? ¿Lo ves fácil? ¿Qué casos de uso se te ocurren para esto?

from fastapi import FastAPI

app = FastAPI()

@app.get("/endpoint")
async def endpoint():
    return {"message": "Esta es mi primera API"}

@app.post("/endpoint/{nombre}")
async def endpoint_post(nombre: str):
    return {"message": f"Hola {nombre}, estas desarrollando tu primera api"}