Creación de un CRUD en Golang

Creación de un CRUD en Golang

Dicen por ahí que, cuando comienzas en el mundo de la programación, existe una “maldición” que solo se puede romper cuando logras ejecutar tu primer “Hello World”, ¿verdad o no? No vamos a arriesgarnos, ¿verdad? (risas).

Personalmente, creo que la historia detrás del mito se refiere a las pequeñas complejidades de entender, estructurar y organizar los paquetes y bibliotecas necesarios para ejecutar una clase principal, sea cual sea el lenguaje; cada uno tiene sus particularidades.

Y si ejecutar un “Hello World” te libera de una maldición, ¿qué te parece aprender a crear un CRUD? Esta abreviatura se refiere a las cuatro operaciones funcionales en un sistema. Si eres principiante en programación, te aseguro que aprender a escribir un CRUD te ayudará a expandir tu razonamiento sobre clases, repositorios, DTO, controladores, métodos, funciones, etc. Considera el CRUD como una puerta de entrada para aprender conceptos avanzados de programación.

Pero ojo, no todo en el día a día de un programador se resume a desarrollar CRUDs. Yo diría que esto es solo una gota de agua en el océano, ¡así que no te detengas aquí, sigue adelante!

CRUD es el acrónimo de:

Create   - Crear

Read       - Leer

Update    - Actualizar

Delete      - Eliminar

Aunque las operaciones CRUD se usan con frecuencia en sistemas que utilizan protocolos de red, como HTTP, HTTPS y TCP, no son exclusivas de estos protocolos. El concepto de CRUD es ampliamente aplicable a sistemas de gestión de datos en general, incluyendo bases de datos, APIs, sistemas de archivos y otras formas de almacenamiento y comunicación de datos. Como mencioné anteriormente, el CRUD es una excelente puerta de entrada para conceptos avanzados de programación.

En este artículo, vamos a mapear estas operaciones para un sistema web utilizando el protocolo HTTP.

Pero antes, ¿qué te parece revisar algunos conceptos de HTTP?

Conceptos HTTP

HTTP, o Protocolo de Transferencia de Hipertexto (Hypertext Transfer Protocol), es un protocolo de comunicación utilizado en la World Wide Web (Web) para la transferencia de información entre un cliente (como un navegador web) y un servidor (donde se encuentran los recursos, como las páginas web). El HTTP es fundamental para la forma en que navegamos en internet y accedemos a recursos en línea.

Existen varios métodos utilizados por HTTP, los más populares son:

GET - Se utiliza para buscar un recurso específico en el servidor. Una solicitud GET puede ser responsable de leer miles de archivos, líneas y tablas, y devolver el resultado solicitado por el cliente.

POST - Se utiliza para enviar datos del cliente al servidor. ¿Sabes cuando llenas un formulario y haces clic en el botón “enviar”? Estamos realizando una operación del tipo POST.

PUT - Utilizamos este método para alterar datos específicos en nuestro servidor. El PUT se usa mucho en operaciones de actualización de registros o edición de contenido.

DELETE - Se utiliza para eliminar datos del servidor. El cliente envía una solicitud, y el servidor, al procesar el comando, elimina el dato solicitado.

¿Ves la similitud entre los métodos?

Create: Generalmente mapeado al método HTTP POST.

Read: Generalmente mapeado al método HTTP GET.

Update: Generalmente mapeado al método HTTP PUT.

Delete: Generalmente mapeado al método HTTP DELETE.

Por lo tanto, aunque las operaciones CRUD tienen una relación cercana con protocolos de red como HTTP, tienen un alcance más amplio y pueden aplicarse en varios contextos de gestión de datos.

Entonces, conceptos revisados, presentaciones hechas, ¡vamos a poner manos a la obra!

Implementación utilizando Gorilla Mux

Vamos a comenzar creando un nuevo proyecto en la IDE de tu preferencia. Luego, en el terminal, asegúrate de estar dentro de la carpeta del proyecto y utiliza el comando go mod para iniciar un nuevo módulo, como en el ejemplo:

Para este ejemplo, voy a llamar al proyecto Crud, ya que los nombres deben ser objetivos.

Go Mod es una herramienta utilizada para gestionar dependencias en proyectos Go. Fue introducida en Go 1.11 como una manera de reemplazar la dependencia en GOPATH.

Esto creará un archivo llamado go.mod en tu directorio.

Ahora puedes añadir dependencias a tu proyecto. Para hacerlo vía terminal, puedes usar el comando go get seguido del camino del paquete que deseas añadir. Para nuestro ejemplo, vamos a añadir la biblioteca gorila/mux, que ayudará en la comunicación entre el servidor y el cliente:

Nota que la dependencia fue añadida a nuestro archivo go.mod

Vamos a crear nuestro módulo principa src (source), y dentro de él, añade el archivo main.

A continuación, añade las configuraciones básicas para iniciar un servidor web:

En este ejemplo:

r := router.StartRouter(): está llamando a la función StartRouter() del paquete router, este paquete se refiere a un enrutador/mux personalizado que vamos a crear para gestionar rutas y solicitudes HTTP del aplicativo.

log.Fatal(http.ListenAndServe("localhost:8080", r)): esta línea está utilizando la función http.ListenAndServe(), del paquete net/http, para iniciar el servidor web. Esta función recibe dos argumentos: la dirección que el servidor debe escuchar, en este caso, "localhost:8080", y la variable r, que representa nuestro enrutador personalizado

Dentro del módulo principal src, crea un módulo para el controlador controller, y dentro de él crea el archivo controller.go


Ahora, dentro del módulo principal src, creamos un nuevo módulo llamado router, que será el responsable de organizar los demás paquetes de nuestro servidor.

Dentro del módulo router, crea el módulo userrouter, en este artículo, no abordaremos la conexión con la base de datos, por lo que usaremos este módulo para crear algunas configuraciones de mocks.

La estructura de paquetes debería quedar así:

  • crud/src/router/userrouter/users.go

El archivo debería quedar así:

Aún dentro del paquete userrouter, crea el archivo routers.go, que contendrá la struct con las configuraciones de mock de nuestro enrutador:

- scr/router/userrouter/routers.go

El archivo debería quedar así:

Donde:

URI: es el camino utilizado por el servidor para buscar los datos solicitados durante la petición.

Method: especifica el método HTTP que la solicitud debe utilizar.

FunctionRouter func (w http.ResponseWriter, r *http.Request): Este campo es un tipo de función que será llamada cuando una solicitud correspondiente al URI y al método HTTP sea recibida por el servidor. La función recibe dos parámetros:

(http.ResponseWriter): Este es un objeto que permite escribir una respuesta HTTP de vuelta al cliente. Se utiliza para enviar los datos de respuesta, como HTML, JSON, etc.

(*http.Request): Este es un objeto que representa la solicitud HTTP recibida del cliente. Contiene información sobre la solicitud, como el método, los encabezados, los parámetros, el cuerpo, entre otros.

Auth: Habilita la autenticación para la seguridad de nuestra aplicación. En este ejemplo, su uso siempre será false, pues como mencioné estamos utilizando mocks de respuestas.

La función Config, recibe como parámetro un puntero del tipo mux.Router, y retorna el mismo tipo.

routers := userRouters: aquí la variable routers está siendo inicializada con el conjunto de rutas definido en userRouters.

for _, rota := range routers : Este es un ciclo que itera sobre cada ruta definida en routers.

Dentro del ciclo, se está usando el método:

r.HandleFunc(rota.URI, rota.FunctionRouter).Methods(rota.Method)

que pertenece al enrutador mux.Router, su finalidad es asociar una función de manejo a una ruta específica con un método HTTP específico. Esto significa que cuando se envíe una solicitud HTTP que coincida con el URI y el método especificado, se llamará a la función rota.FunctionRouter para manejar la solicitud.

Después de iterar por todas las rutas y asociar las funciones de manejo, la función retorna el objeto mux.Router modificado, ahora configurado con las rutas definidas.

Ahora, con todas las configuraciones creadas, vamos a personalizar nuestro enrutador e insertar esas configuraciones.

Dentro del paquete router, crea el archivo router.go

Al final, la estructura debe seguir esta orden:

  • crud/src/router/router.go

Dentro del archivo router.go, escriba la siguiente configuración:

Finalmente, la estructura del paquete debería verse así:

-Crud - Proyecto

-src - módulo principal

-controller: punto de entrada de las solicitudes.

-router: módulo responsable de almacenar las configuraciones del enrutador

-userrouter:

routers.go

users.go

go.mod: archivo que contiene las dependencias del proyecto

main: archivo principal de la aplicación

Inicia tu aplicación en el archivo main, y prueba el retorno de las funciones con Postman.

Códigos de Retorno HTTP

Como abordamos algunos aspectos y configuraciones de servidores HTTP, aquí van algunas recomendaciones sobre los retornos más comunes que se encuentran en el día a día, incluso durante alguna búsqueda en la web. No te preocupes por memorizarlos todos, pero como programador, conocer el número inicial de cada retorno puede ayudarte a identificar rápidamente los tipos de problemas en tu aplicación:

1xx (Informativo) : Estos códigos indican que la solicitud fue recibida y el servidor está esperando más acciones del cliente.

2xx (Éxito) : Estos códigos indican que la solicitud fue exitosa. El código más común es el 200 (OK), que se devuelve cuando una página se proporciona con éxito.

3xx (Redirección) : Estos códigos indican que la solicitud necesita acciones adicionales para ser completada. Esto puede ser una redirección a otra URL o el uso de una caché.

4xx (Error del Cliente) : Estos códigos indican que ocurrió un error por parte del cliente. El código 404 (Not Found) es el más conocido, indicando que el recurso solicitado no se encontró en el servidor.

5xx (Error del Servidor) : Estos códigos indican que ocurrió un error en el servidor al procesar la solicitud. El código 500 (Internal Server Error) es un ejemplo, detallando un error interno en el servidor.

Espero que este artículo te haya sido útil y haya contribuido a tu aprendizaje, que tengas buenos estudios!

💡
Las opiniones y comentarios emitidos en este artículo son propiedad única de su autor y no necesariamente representan el punto de vista de Listopro.

Listopro Community da la bienvenida a todas las razas, etnias, nacionalidades, credos, géneros, orientaciones, puntos de vista e ideologías, siempre y cuando promuevan la diversidad, la equidad, la inclusión y el crecimiento profesional de los profesionales en tecnología.