Construyendo aplicaciones Web con Go

Enrutamiento URL

Para algunas aplicaciones simples, el valor predeterminado http.ServeMux te puede llevar muy lejos. Si necesitas más poder en la forma de analizar sintácticamente los puntos finales del URL y encaminarlos al controlador adecuado, posiblemente tengas que utilizar una biblioteca de enrutamiento de terceros. Para este tutorial, vamos a utilizar la conocida biblioteca github.com/gorilla/mux como nuestro enrutador. github.com/gorilla/mux es una gran opción para un enrutador, ya que tiene una interfaz que le es familiar a los usuarios de http.ServeMux, sin embargo, tiene un montón de características adicionales construidas en torno a la idea de encontrar el http.Handler adecuado para la ruta al URL dado.

En este ejemplo, crearemos algún enrutamiento para un recurso REST llamado "mensajes". A continuación definiremos mecanismos para ver el índice, mostrar, crear, actualizar, destruir y editar mensajes. Afortunadamente con github.com/gorilla/mux, no tenemos que hacer demasiadas operaciones copiar/pegar para lograrlo.

package main

import (
    "fmt"
    "net/http"

    "github.com/gorilla/mux"
)

func main () {
    r:. = mux.NewRouter()StrictSlash(false)
    r.HandleFunc("/", ControladorInicio)

    // Colección de mensajes 
    mensajes: = r.Path("/mensajes").Subrouter()
    mensajes.Methods("GET").HandlerFunc(ControladorIndiceMensajes)
    mensajes.Methods("POST").HandlerFunc(ControladorCreaMensajes)

    // Mensaje singular 
    mensaje: = r.PathPrefix("/mensajes/{id}").Subrouter()
    mensaje.Methods("GET").Path("/editar").HandlerFunc(ControladorEditarMensaje)
    mensaje.Methods("GET").HandlerFunc(ControladorMostrarMensaje)
    mensaje.Methods("PUT", "POST").HandlerFunc(ControladorActualizaMensaje)
    mensaje.Methods("DELETE").HandlerFunc(ControladorEliminaMensaje)

    fmt.Println("Iniciando el servidor en :8080")
    http.ListenAndServe(":8080", r)
}

func ControladorInicio(rw http.ResponseWriter, r *http.Request) {
    fmt.Fprintln(rw, "Inicio")
}

func ControladorIndiceMensajes(rw http.ResponseWriter, r *http.Request) {
    fmt.Fprintln(rw, "índice de mensajes")
}

func ControladorCreaMensajes(rw http.ResponseWriter, r *http.Request) {
    fmt.Fprintln(rw, "crear mensajes")
}

func ControladorMostrarMensaje(rw http.ResponseWriter, r *http.Request) {
    id: = mux.Vars(r)["id"]
    fmt.Fprintln(rw, "mostrando mensaje", id)
}

func ControladorActualizaMensaje(rw http.ResponseWriter, r *http.Request) {
    fmt.Fprintln(rw, "actualizando mensaje")
}

func ControladorEliminaMensaje(rw http.ResponseWriter, r *http.Request) {
    fmt.Fprintln(rw, "borrar mensaje")
}

func ControladorEditarMensaje(rw http.ResponseWriter, r *http.Request) {
    fmt.Fprintln(rw, "editar mensaje")
}

Ejercicios

  1. Explora la documentación de github.com/gorilla/mux.
  2. Juega con los diferentes métodos de cadenas de caracteres para crear filtros y subenrutadores.
  3. Averigua qué tan bien juega github.com/gorilla/mux con el http.Handler existente tal como http.FileServer.