Aprende a crear una API REST en Go con Gorilla Mux, gestionar dependencias con go mod y recibir webhooks de GitHub en local usando ngrok. El enfoque es práctico y transversal: más allá del lenguaje, se refuerzan conceptos como router, handler, lectura de request body y la práctica de fallar rápido ante errors.
¿Cómo preparar el entorno en Go y gestionar dependencias?
Configura el proyecto en una carpeta llamada GitHubTracker y habilita el manejo de dependencias con go mod. Se usa go get para traer Gorilla Mux. Para tener dependencias locales, se crea la carpeta vendor y se sincroniza con go mod vendor. También se verifica el estado con go mod tidy y se revisan los archivos go.mod y go.sum.
Crea el módulo con go mod init y define el nombre del proyecto.
Instala Gorilla Mux con go get y revisa go.mod actualizado.
Usa vendor para dependencias locales y evitar fallos de resolución.
Sincroniza y limpia referencias con go mod tidy.
# dentro de GitHubTracker
go mod init GitHubTracker
# dependencia del *router*
go get github.com/gorilla/mux
# dependencias locales
go mod vendor
# sincronizar referencias
go mod tidy
¿Cómo crear un endpoint con Gorilla Mux y procesar requests?
Se implementa un router con Gorilla Mux, se define el endpoint POST en "/hello" y un handler que lee el body como bytes con io.ReadAll. Se imprime un mensaje de llegada y, si hay error, se falla rápido: se reporta y se interrumpe la ejecución del método.
¿Qué código mínimo se implementa?
package main
import("fmt""io""log""net/http""github.com/gorilla/mux")funcpostHandler(w http.ResponseWriter, r *http.Request){ fmt.Println("Received post request")defer r.Body.Close() body, err := io.ReadAll(r.Body)if err !=nil{ fmt.Println("Error reading the request") log.Println(err)return} fmt.Println(string(body))}funcmain(){ r := mux.NewRouter() r.HandleFunc("/hello", postHandler).Methods("POST") fmt.Println("ServerListening on port 8080")if err := http.ListenAndServe(":8080", r); err !=nil{ log.Println(err)}}
Router con mux.NewRouter y handler con HandleFunc.
Endpoint POST: "/hello".
Lectura del body con io.ReadAll y conversión a string.
Mensajes de diagnóstico: "Received post request" y "Error reading the request".
¿Cómo configurar ngrok y webhooks de GitHub para pruebas locales?
Se expone el servicio local en el puerto 8080 con ngrok para obtener una URL pública temporal. Luego, en el repositorio de GitHub, se crea un webhook que apunte a esa URL más la ruta "/hello". Se elige Content typeJSON, sin secret por ahora, con verificación SSL habilitada, y se activa el evento de push. Para dispararlo, se hace commit y push del código. Se recomienda añadir un .gitignore para excluir la carpeta vendor y archivos como .DS_Store.
¿Qué comandos y archivos usar?
# ejecutar el servidor local
go run main.go
# en otra terminal, exponer el puerto 8080
ngrok http 8080
/vendor/.DS_Store
¿Qué configurar en GitHub Webhooks?
Ruta del payload: URL pública de ngrok + "/hello".
Content type: application/json.
Sin secret por el momento.
SSL verification: enabled.
Evento: push.
Si tienes two factor authentication, completa la verificación.
Al hacer push, en GitHub se ven las "Recent deliveries": primero un "ping" de creación y luego el push. El payload es amplio, pero el apartado head_commit concentra lo útil para el seguimiento:
id del commit.
timestamp del commit.
autor: nombre y email.
archivos cambiados.
mensaje del commit.
¿Te gustaría que añadamos validación de firma con secret o persistencia del payload en base de datos en la siguiente parte? Deja tus dudas y comenta qué te gustaría automatizar con estos webhooks.
En el repo de GitHub vamos a Settings, luego a Webhooks -> Add webhook, donde pegamos la URL en Payload URL. En este caso en Content type corresponde application/json.
En SSL verification seleccionar Enable SSL verification.
En Which events would you like to trigger this webhook? seleccionamos Just the push event.
Y tildamos Active para finalmente cliquear en Add webhook.
Muy interesante, aprender nuevas tecnologías.
eyyy para los nuevos posiblemente les instale en al versión 1.18 a mi me paso y el curso pide la 1.22 :
sigan estos pasos
Desinstalar la extensión GO de VS CODE WSL
Recargar VS CODE
sudo apt update
sudo apt upgrade
cd /
sudo rm -rf usr/local/go
cd ~
sudo rm -rf go
mkdir temp
cd temp
wget
sudo tar -xvf go1.22.9.linux-amd64.tar.gz
sudo mv go /usr/local
export GOBIN=$GOPATH/bin
export GOROOT=/usr/local/go
export PATH=$PATH:$GOBIN:$GOROOT/bin
go version
si sigue con la versión 1.18 reinician y ya debería salir la 1.22.9
saludos!!!! pst llevo 3 horas y ya pude
Gracias por publicar, estas cosas son las que hacen diferente a la comunidad de Platzi
muy buena explicación, muchas gracias!
He volado fuerte, pero me está gustando
Configurar webhooks con Go y usar ngrok para exponer el servidor local es una buena manera rápida de hacer pruebas y desarrollo, pero en el día a día hay que tener cuidado con algunas cosas. Ngrok es genial para prototipos, pero no es una solución para producción porque las URLs cambian cada vez que lo inicias, y eso puede afectar la confiabilidad del webhook. Además, en Go hay que manejar bien el manejo de concurrencia y errores para que el servicio sea estable cuando reciba muchas peticiones. Por último, hay que pensar en la seguridad, porque exponer endpoints con ngrok sin protegerlos puede abrir puertas a ataques o datos sensibles. Así que, para desarrollo está bien, pero para producción se necesita un despliegue más sólido y seguro.
No esta mal el curso pero si hubo muchas cosas que tuve que buscar en la ia porque no las entendia muy bien y tampoco hay mucha explicacion de cada cosa, definitivamente hay que aprender Go
Perdonen compañeros... ¿Pero no me enterao de nada de esta clase? ¿Por qué usamos Go y no Node por ejemplo...? ¿Cuál es el propósito de esta lección? ¿Qué es un webhook? ¿Podemos usarlo con otra cosa que no sea github? Muchísimas gracias por vuestra amabilidad y paciencia!!
Hola Baldan, no nos enfocamos en el lenguaje de programación porque la idea es que logran transferir los conocimientos al lenguaje de programación que usen. En este caso decidí usar Go por su curva de aprendizaje rápida para introducirlos en un nuevol lenguaje
El objetivo de todo el curso es que aprendan las herramientas y puedan buscar por su cuenta cómo aplicarlas en su lenguaje, gestor de código o infraestructura deseada. Espero que lo disfrutes 🤓
Rayiosss - Yo Nunka habiase visto un VSCode EN LIGHT, Cielos que mis Ojos Se Recinten , Yo soliase pensar que naide Usaba VisualStudioCode en Light y ahora veo alguien que si lo hace y me causa mucha impresion,\n ps todo el mundo lo usa en Dark.
Ten en cuenta que los conocimientos adquiridos ene ste curso no aplican solo para aplicaciones desarrolladas en Go, y puedes trasladar esos conocimientos al lenguaje que desees
X2 Creo que primero el curso minimo de go para entender el curso.