Vicente Rodríguez

Nov. 1, 2016

Como crear una web app sencilla en go

En este tutorial crearemos una web app desde cero solo con go y gorilla mux que nos ayudara a crear rutas mas fácil.

Tenemos que tener correctamente nuestro $GOPATH y crear el proyecto dentro de la ruta de go:

/Users/tuUsuario/go/src

configuración

también instalar mux:


go install github.com/gorilla/mux

Si necesitas ayuda no dudes en mandarme un mensaje.

El código del proyecto esta en esta url.

Creando las rutas

Empezaremos creando las rutas y el creador de rutas para nuestra app, creamos una carpeta llamada routes y dentro un archivo new_router.go:


package routes

//lo agregamos al mismo paquete para que puedan comunicarse entre si, y tengamos la estructura

//disponible cuando importemos el paquete



import (

  "net/http"

)



type Router struct {

  Name string

  Method string

  Path string

  HandlerFunc http.HandlerFunc

}

//creamos una estructura nueva que tenga los valores que las rutas necesitan



Creamos la estructura que tendrán nuestras rutas, en este caso un nombre, un método(get, post), path (url) y un handler, este ultimo vendrá de los controladores e indicara que se ejecutara cuando accedamos a la ruta.

Creamos otro archivo llamado routes.go:


package routes



import (

  "projects/webApp/controllers/users"

)

//importamos los controladores que se encargaran de entregar una vista cuando apunten a una url especifica

// "projects/webApp/controllers/users" lo tienen que sustituir con su GOPATH y apuntar a donde tengan los controllers



//creamos un nuevo dato que es un array de routers

type Routes []Router



var routes = Routes{

  Router{

    "Index",

    "GET",

    "/",

    usersController.Index,

  },

  Router{

    "Show",

    "GET",

    "/show",

    usersController.Show,

  },

}

En este archivo declaramos las rutas que necesitamos para nuestra app, en este caso solo queremos tener un index y un show para los usuarios.

por ultimo creamos un archivo llamado router.go:


package routes

//es parte del paquete routes para que sea un archivo que se pueda importar



import ( //importamos las librerías que necesitamos

  "github.com/gorilla/mux"

)



func NewRouter() *mux.Router {

  //se crea un nuevo router de la libreria gorilla/mux

  router := mux.NewRouter().StrictSlash(true)



  for _, route := range routes { //se recorren todas las rutas que tengamos creadas, ver archivo routes.go

    router.

      Methods(route.Method).

      Path(route.Path).

      Name(route.Name).

      Handler(route.HandlerFunc)

      //cada ruta se agrega a router

  }

  return router //se regresan todas las rutas ya guardadas

}



En este archivo ponemos en marcha la libreria mux para crear un router, como podemos notar podemos acceder a todas las variables y métodos declarados en el mismo paquete (en este caso routes), por cada ruta que tengamos declarada se agregara a el router de mux.

Creando el modelo

Antes de empezar con los controladores necesitamos crear el modelo del usuario, creamos una carpeta llamada models y dentro otra llamada user, por ultimo un archivo llamado user.go:


package userModel



type User struct {

  Name string

  Email string

}

El archivo es simple, solo creamos una nueva estructura de tipo User y ponemos los atributos que queramos que tenga.

Creando los controladores

Llegamos a la parte interesante, primero creamos una carpeta controllers y dentro otra carpeta llamada users por ultimo el archivo users_controller.go:


package usersController

//para tener un orden le llamaremos usersController



import (

  "net/http"

  "html/template" //agregamos la libreria de templates

  "projects/webApp/models/user"

)



//creamos las funciones que corresponden a las rutas

func Index(w http.ResponseWriter, r *http.Request) {

  t, _ := template.ParseFiles("views/users/index.html") //indicamos la ruta del template/html

  t.Execute(w, nil) //se hace render del template

}



func Show(w http.ResponseWriter, r *http.Request) {

  user := &userModel.User{ Name: "Alberto", Email: "albert@email.com" } //creamos un nuevo usuario

  t, _ := template.ParseFiles("views/users/show.html") //indicamos a ruta del template

  t.Execute(w, user) //le pasamos al usuario al template para que este disponible

}

Indicamos como en todos los archivos al paquete que pertenece, importamos las librerías, aquí hacemos uso del modelo User y de la libreria "html/template" para hacer render de archivos html.

Por cada método o ruta que necesitemos creamos una función.

Es importante que las funciones empiecen con mayúscula para que puedan ser exportadas en otros paquetes.

Index

La función index es de tipo http handler, esta tiene que recibir dos parámetros, un response y un request, el response sirve para poder contestar la petición que hace el usuario y el request para obtener información de la petición del usuario. Creamos un nuevo template pasando la ruta de la vista en html, este template nos puede regresar dos objetos un error o el template en este caso no puede existir error si la ruta esta bien puesta entonces no lo tomamos en cuenta, al final pasamos el objeto response al objeto template para responder con la vista.

Show

La función show funciona de igual manera que index, se le pasa dos parámetros y esta se encarga de responder al usuario, solo que aquí creamos un nuevo usuario usando nuestro modelo y cambiamos la ruta de la vista por show, al final hacemos render del template y le pasamos el objeto user para tener la información disponible en la vista.

Vistas

Para terminar creamos la carpeta views y dentro de esta la carpeta users, aqui dos archivos, index.html y show.html:

I ndex


<!DOCTYPE html>

<html>

  <head>

    <meta charset="utf-8">

    <title></title>

  </head>

  <body>

    <h1>Index page</h1>

    <h3>Usuarios</h3>

    <a href="/show">user1</a>

  </body>

</html>

Este es un html común y corriente.

Show


<!DOCTYPE html>

<html>

  <head>

    <meta charset="utf-8">

    <title></title>

  </head>

  <body>

    <h1>Show page</h1>

    <h3>Usuario</h3>

    {{.Name}} <br>

    {{.Email}}

  </body>

</html>

Esta vista cambia un poco, cuando le pasamos un objeto a un template en go para poder imprimir la información del objeto lo hacemos entre {{}} omitimos el nombre del objeto y accedemos directamente a sus atributos:


.Name

.Email

el punto es importante para acceder a los datos.

Archivo principal

El ultimo paso es crear el archivo principal para iniciar el servidor y al que le pasamos las rutas que creamos:


package main



import (

  "log"

  "net/http"

  "projects/webApp/routes"

)



func main() {

  router := routes.NewRouter()

  log.Fatal(http.ListenAndServe(":8080", router))

}

Para crear la app corremos:


go build app.go

y para ejecutar la app:


./app