Développer sa première webapp avec go

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.

Système de template

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.

Le code du serveur

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 :

  1. Le package net/http contient de quoi faire un serveur web.
  2. Le package html/template permet de gérer les templates.
  3. La structure Page décrit les données passées à la page web (le template, lors de son exécution).
  4. La ligne template.Must(template.ParseFiles(... permet de parser le template (qui doit être obligatoirement présent et ne pas contenir d'erreur de syntaxe). Le fait d'être dans une variable globale fait que les templates parsés sont en cache.
  5. Dans la fonction main, on indique que la fonction homeHandler gèrera les URLs du type http://localhost:9999/home.
  6. On lance ensuite le service de manière à ce qu'il réponde aux requêtes HTTP sur le port 9999.
  7. Dans la fonction homeHandler, on initialise la structure Page en utilisant le système des champs nommés.
  8. On exécute ensuite le template en lui passant la variable p.

Le contenu du template

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>

Servir des ressources statiques

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">

Gestion des paramètres

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".

Conclusion

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.

Pour aller plus loin

Je vous conseille la lecture de mes articles :


Étiquettes :   debuter   webapp 
Portrait de Benjamin BALET
Benjamin BALET
Consultant APM

Retrouvez mes cooordonées

Benjamin BALET sur viadeo






Vous aimerez aussi

Les lois de la réflexion

Une traduction du blog officiel de golang expliquant le mécanisme de la réflexion en Go.   Lire »

Gérer les informations de session avec Gorilla

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 »

Comment gérer efficacement les erreurs en golang ?

Préconisations officielles pour la gestion des erreurs dans un programme golang. Cet article complète les explications sur panic, defer et recover   Lire »

Gobs le format natif d'échange de données en Go

Traduction d'un article du blog officiel expliquant comment échanger des données entre deux programmes golang grâce à un format natif   Lire »

Canaux et go routines avec ou sans état

Exemples d'utilisation du type chan et des go routines stateful et stateless   Lire »

Commentaires

Soyez le premier à commenter cet article

Publier un commentaires

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.

(requis)
(requis)
(requis, mais non publié)
(recommandé si vous souhaitez être publié)