Go: API REST con MySQL

En este artículo de programación en el lenguaje Go (también conocido como Golang) vamos a ver cómo crear una API REST que se comunica a través de JSON, guardando y mostrando los datos a partir de una base de datos de MySQL / MariaDB.

Al final vamos a tener una API REST con Go usando los 4 métodos: POST, PUT, DELETE y GET usando el enrutador Mux. Además vamos a implementar las 4 operaciones de una base de datos: insert, update, delete y select.

Te dejaré al final el código completo y además una explicación en mi canal de YouTube.

Base de datos

Vamos a consumir una base de datos de videojuegos. Por lo tanto recuerda crear una base de datos con el nombre de tu preferencia (yo la he llamado video_games) y colocar dentro la siguiente tabla:

Los datos que vamos a manejar son id como bigint que se convertirá en un int64 al mapearlo para Go. El nombre y género serán de tipo varchar, convertidos a string en Go. Y finalmente el año será un entero igualmente de tipo int64 para golang.

Configurando credenciales de acceso a base de datos

Lo primero que tienes que hacer es configurar las credenciales de acceso a la base de datos en el archivo llamado .env. Si no existe, debes crearlo basándote en el archivo .env.example. En mi caso se ve así:

Del archivo podemos notar varias cosas; todas relacionadas con las credenciales de acceso a la base de datos de MySQL.

En este caso mi usuario es root, no cuento con contraseña; el host es localhost en el puerto 3306 y el nombre de la base de datos es video_games (recuerda crearla desde la consola de MySQL o phpmyadmin).

El archivo de entorno se va a leer y cargar en las variables. En el archivo de variables además definimos el dominio permitido para CORS, pues de este modo podemos consumir esta API desde otro dominio:

Como lo puedes notar, en la línea 10 estamos definiendo la cadena de conexión a la base de datos. Finalmente definimos la función que nos ayudará a conectar a MySQL desde Go:

Recuerda que anteriormente ya te mostré cómo conectar MySQL con Go solo que el ejemplo era por consola.

Structs y funciones útiles

En toda esta API que estamos creando vamos a manejar videojuegos para ejemplificar de una manera sencilla.

Para ello definimos el struct de Videojuego que tiene los mismos campos que definimos en la base de datos. Lo que está entre backticks es para indicar el nombre que tendrá la propiedad al leerse y decodificarse de JSON.

Adicional al struct definimos algunos útiles, por ejemplo, una función para convertir de cadena a int64 que nos servirá para leer variables de la URL y convertirlas a entero.

Controlador

No planeo utilizar ninguna metodología ni cosas de esas; pero he colocado todas las operaciones del modelo (el CRUD) en un mismo archivo. Queda así:

Todas las funciones devuelven al menos un argumento que es de tipo error, pues así se puede manejar las posibles fallas que se encuentren en la ejecución. Además, estamos evitando inyecciones SQL pues si te fijas usamos placeholders en lugar de concatenar cadenas.

Por cierto, todas las funciones reciben o devuelven el tipo de dato VideoGame que vimos anteriormente. Las funciones son:

  • createVideoGame – Insertar un videojuego en la base de datos de MySQL
  • deleteVideoGame – Eliminar un videojuego a partir de su id usando Go
  • updateVideoGame – Actualizar un videojuego en la base de datos
  • getVideoGames – Obtener todos los videojuegos existentes como un arreglo de tipo VideoGame
  • getVideoGameById – Obtener un videojuego por id

Estas funciones serán expuestas con el enrutador, ahí es en donde vamos a conectar a MySQL con Go para exponer o traer los datos.

Definiendo rutas de la API con Go

Llegamos al punto en donde vamos a exponer nuestro controlador y base de datos a través de una API usando Go. Las definimos dentro de una función que recibe el enrutador, de este modo hacemos las cosas más simples y separamos conceptos.

Básicamente es configurar los endpoint de la API creada con Go, invocando a las funciones del controlador. Veamos a continuación las funciones enableCORS, respondWithSuccess y respondWithError.

Una cosa importante es la parte en donde se decodifica todo el cuerpo de la petición desde JSON al struct, lo cual puedes ver en la línea 40, leemos la petición desde r.Body y luego la decodificamos dentro de la variable creada anteriormente.

Hacemos lo mismo (decodificar JSON de la petición) para hacer el update, eso en la línea 56.

Middleware de CORS

CORS permite compartir recursos en dominios distintos. Es decir, permite que consumas localhost:8000 desde localhost:80 o similares; algo así como si fuera posible consumir facebook.com desde google.com

Si tú no usarás esta característica, simplemente comenta el código que la usa en el enrutador. Lo que vamos a hacer es agregar encabezados que van a permitir CORS para el dominio configurado previamente en las variables.

Para lograrlo, vamos a interceptar todas las peticiones para agregar estos encabezados.

Responder al cliente

También tenemos dos funciones que nos van a ayudar a responderle al cliente que consuma la API; una es para responder con éxito (código HTTP 200) y otra para responder con error (código 500).

La que responde con error recibe el error y lo muestra como cadena. La función que responde con éxito recibe un parámetro de tipo interface, que es algo así como un tipo de dato genérico en Go. Ambas funciones codifican la respuesta como JSON.

Poniendo todo junto

API REST con Go y MySQL codificando con JSON

Para terminar este tutorial veamos cómo es el método main. Este método es el punto de entrada de los programas en Go, por lo tanto en esta función es en donde hacemos un ping a la base de datos, configuramos las rutas y encendemos el servidor en el puerto especificado.

Recuerda que para compilar debes haber instalado Go. Luego de eso, en el directorio en donde está el código, ejecuta go build y ejecuta el archivo que aparezca. Si el firewall pide permisos, dáselos. De igual modo he escrito un poco de documentación en el readme del proyecto.

Puedes probar la API desde cualquier lenguaje de programación o usando Postman como yo lo he hecho en mi vídeo:

Aquí te dejo el código completo, como siempre, en mi GitHub. Te invito también a leer más sobre Go en mi blog.

Encantado de ayudarte


Estoy disponible para trabajar en tu proyecto, modificar el programa del post o realizar tu tarea pendiente, no dudes en ponerte en contacto conmigo.

No te pierdas ninguno de mis posts

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.

Dejar un comentario