Interactiu

++++

<< BACK
Date: 1 Jul 2014

Aprendiendo GoLang

---

Siempre prefiero tener alguna cosa nueva, con la que desintoxicarme del trabajo cuotidinao para clientes. Hacía tiempo que miraba este lenguaje y finalmente (en medio de un proyecto grande y pesado), me decidí a aprenderlo.

Picar código

No hay mejor manera de aprender un lenguaje que picando código, y viendo, la facilidad con la que se construyen aplicaciones web en golang, me propuse el reto de construir un pequeño servidor http de los archivos que tienes en la carpeta donde lo estás ejecutando.

Indangando en los ejemplos del código fuente de sus librerías, encontré el paquete net/http, donde mirand su documentación, había un ejemplo muy simple para servir archivos mediante http.

package main

import (
    "log"
    "net/http"
)

func main() {
    log.Fatal(http.ListenAndServe(":8080", http.FileServer(http.Dir("/usr/share/doc"))))
}

Probé el código, lo compilé y funcionaba. A partir de aquí, empecé a pensar como evolucionar el código, para poder hacer algo mas interesante.

Empezando a retocar el programa

Investigando un poco la api, y viendo algunos otros ejemplos, descubri el tipo ServerMux, un http request multiplexer, o lo que es lo mismo, un tipo que te permite configurar rutas, con funciones que las reciben:

mux := http.NewServeMux()
mux.Handle("/", http.HandlerFunc(handleReq))
log.Printf("Listening.....")
http.ListenAndServe(port, mux)

En concreto, hacer pasar todas las peticiones, por la función handlerReq(w http.ResponseWriter, r *http.Request), donde w es un objeto response clásico y r una request con todos sus parámetros.

De esta forma ya podía construir mi pequeño servidor de archivos, si la ruta solictada terminaba en “/”, tenía que cargar la lista de arhvivos del directorio y mostrarlos con mi template. De no ser así, usaba, el código genérico para servir archivos. Código en Github

Siguientes pasos

Si la petición iba contra un directorio, debía de mostrar el contenido de este usando mis propias plantillas. Para ello, golang, dispone de un potente sistema de plantillas. Con lo cual, la lógica de la función handleDir, era fácil: Miraba si el directorio existia, leía el contenido de este, con el paquete os, iteraba por la lista de archivos usando el Readdir y construía en una variable de texto el html necesário para pintarla.

Una vez hecho esto, cargaba la plantilla html, definida en una variable y la ejecutaba, renderizandola contra el objeto Writer. Código

Más cosas adicionales

Visto que el sistema era fácil, me estaba animando y simpere interesa saber como subir archivos, investigué un poco la forma de realizar uploads en Go. Y también le añadí la capacidad de eliminar archivos, ambas funcionalidades, creando un Form, con los parámetros de la request (muy parecido a Django) y redirigiendo en función de estos.

Colofón

Tenía una aplicación completa, que dado un directorio, actuaba de servidor de arhvivos vía http. Quería dejarlo un poco más bonito, y descubrí el paquete, flag para procesar parámetros de entrada.

Por otro lado me interesaba tener un sistema de mensajes Flash ( típoco de framework web). Básicamente para ser usado al realizar operaciónes y redirigir contra la url del directorio, poder mostrar un mensaje con el resultado de la misma. Las baterías no lo incluían, pero buscando un poqutio, encontré, las Gorilla Sessions, que usando una variable de sesión me permitían esto.

Podeis descargar, modificar, forkear el código de este programa en mi cuenta de github.com/jordic/file_server.

Enlaces usados

Para completar este proyecto, me documenté bastante en:

+++++++++++++++++++++++++++++++++++++

info@tempointeractiu.net
Milà i Fontanals, 14-26 1er 3a
08012 Barcelona
+34934593169 * +34646804998 * +34696959162