go permet de créer un exécutable contenant à la fois du code applicatif et un serveur web. Ce qui est très pratique pour créer un backend Ajax servant du JSON (supporté nativement par la bibliothèque standard) ou une application web à part entière.
Dit rapidement (nous reviendrons sur ce point dans un autre article), il est possible de créer des templates HTML afin de passer des valeurs entre le programme go et la page retournée à l'utilisateur.
package main import ( "net/http" "html/template" ) type Page struct { Valeur string } var templates = template.Must(template.ParseFiles("index.html")) func main() { http.HandleFunc("/home", homeHandler) http.ListenAndServe(":9999", nil) } func homeHandler(w http.ResponseWriter, r *http.Request) { p := Page{Valeur: "mon premier essai"} err := templates.ExecuteTemplate(w, "index.html", p) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) } }
En le lançant puis en accédant à l'url http://localhost:9999/home, vous obtiendrez le contenu suivant dans votre navigateur : Titre de la page : "mon premier essai". Voici le code expliqué pas à pas :
Il existe un système de tags qui permet de faire de la substitution de valeurs, des boucles ou de faire de la logique. Ici, nous nous contenterons d'afficher une variable. Nous verrons dans d'autres articles comment faire des choses plus complexes.
<!doctype html> <html> <head> <meta charset="utf-8"> <title>Essai</title> </head> <body> Valeur : "{{ .Valeur }}" </body> </html>
Pour servir des fichiers statiques, il suffit d'ajouter cette ligne de code avant la ligne qui démarre le serveur web (avec ListenAndServe) :
http.Handle("/", http.FileServer(http.Dir("static/")))
Avec cet exemple, dans les fichiers statiques ou les templates on pointera sur les ressources statiques depuis la racine. Par exemple :
<img src="/test.gif">
On peut facilement modifier le contenu de la fonction qui gère la page d'accueil de notre application en faisant en sorte qu'elle affiche le contenu d'une variable parametre passée indifféremment via le verbe GET ou POST.
func homeHandler(w http.ResponseWriter, r *http.Request) { p := Page{Valeur: r.FormValue("parametre")} err := templates.ExecuteTemplate(w, "index.html", p) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) } }
Dans notre code, cette fonctionnalité est codée avec r.FormValue("parametre") et on peut essayer de relancer notre programme modifié. En accédant à l'url http://localhost:9999/home?parametre=test, le contenu affiché sera Valeur : "test".
Mine de rien, ces quelques bouts de code vous permettront de couvrir pas mal de cas d'usage. Une belle illustration du caractère concis de golang.
Je vous conseille la lecture de mes articles :
Une traduction du blog officiel de golang expliquant le mécanisme de la réflexion en Go. Lire »
La bibliothèque standard de go ne gère pas les variables de session d'une application. Il existe une solution avec le toolkit Gorilla Lire »
Préconisations officielles pour la gestion des erreurs dans un programme golang. Cet article complète les explications sur panic, defer et recover Lire »
Traduction d'un article du blog officiel expliquant comment échanger des données entre deux programmes golang grâce à un format natif Lire »
Exemples d'utilisation du type chan et des go routines stateful et stateless Lire »
Soyez le premier à commenter cet article
Tous les commentaires sont soumis à modération. Les balises HTML sont pour la plupart autorisées. Les liens contextuels et intéressants sont en follow.