Introduzione al framework web Go Iris
Installazione
Nota: Richiede la versione di Go 1.20 o superiore.
$ mkdir myapp
$ cd myapp
$ go mod init myapp
$ go get github.com/kataras/iris/v12@latest
Importalo nel tuo codice:
import "github.com/kataras/iris/v12"
Risoluzione dei problemi durante l'installazione
Se incontri errori di rete durante l'installazione, assicurati che la variabile d'ambiente GOPROXY sia impostata su un valore valido.
go env -w GOPROXY=https://goproxy.io,direct
Se i metodi sopra non risolvono il problema, cancella la cache del modulo go:
go clean --modcache
Inizio Veloce
Modalità Funzionale
$ cat main.go
package main
import "github.com/kataras/iris/v12"
func main() {
// Definisci l'istanza iris
app := iris.New()
// Definisci un gruppo di route, (qui si definisce un gruppo di route con un prefisso /books)
booksAPI := app.Party("/books")
{
// Usa middleware
booksAPI.Use(iris.Compression)
// Imposta le route e i gestori delle route
// GET: http://localhost:8080/books
booksAPI.Get("/", list)
// POST: http://localhost:8080/books
booksAPI.Post("/", create)
}
// Ascolta sulla porta
app.Listen(":8080")
}
// Esempio di libro.
type Book struct {
Title string `json:"title"`
}
func list(ctx iris.Context) {
books := []Book{
{"Mastering Concurrency in Go"},
{"Go Design Patterns"},
{"Black Hat Go"},
}
ctx.JSON(books)
// Nota: Negoziazione della risposta in base alla priorità del server e alla preferenza del client
// invece dell'uso di ctx.JSON:
// ctx.Negotiation().JSON().MsgPack().Protobuf()
// ctx.Negotiate(books)
}
func create(ctx iris.Context) {
var b Book
err := ctx.ReadJSON(&b)
// Nota: usa ctx.ReadBody(&b) per associare i dati in arrivo di qualsiasi tipo.
if err != nil {
ctx.StopWithProblem(iris.StatusBadRequest, iris.NewProblem().
Title("Impossibile creare il libro").DetailErr(err))
// Nota: Usa ctx.StopWithError(codice, err) quando ci si aspetta una risposta in formato testo semplice solo in caso di errore.
return
}
println("Libro ricevuto: " + b.Title)
ctx.StatusCode(iris.StatusCreated)
}
Pattern architetturale MVC
Importare il pacchetto MVC
import "github.com/kataras/iris/v12/mvc"
Configurare il controller basato sul gruppo di route
m := mvc.New(booksAPI)
m.Handle(new(BookController))
Implementazione del controller
type BookController struct {
/* Injection di dipendenza */
}
// Rispondi a GET: http://localhost:8080/books
func (c *BookController) Get() []Book {
return []Book{
{"Mastering Go Concurrency"},
{"Go Design Patterns"},
{"Black Hat Go"},
}
}
// Rispondi a POST: http://localhost:8080/books
func (c *BookController) Post(b Book) int {
println("Libro ricevuto: " + b.Title)
return iris.StatusCreated
}
Esegui il tuo server web Iris:
$ go run main.go
> In ascolto su: http://localhost:8080
> Applicazione avviata. Premi CTRL+C per spegnerla.
Elenco dei libri:
$ curl --header 'Accept-Encoding:gzip' http://localhost:8080/books
[
{
"title": "Mastering Go Concurrency"
},
{
"title": "Go Design Patterns"
},
{
"title": "Black Hat Go"
}
]
Crea un nuovo libro:
$ curl -i -X POST \
--header 'Content-Encoding:gzip' \
--header 'Content-Type:application/json' \
--data "{\"title\":\"Scrivere un interprete in Go\"}" \
http://localhost:8080/books
> HTTP/1.1 201 Created
Questo è un esempio di risposta errore:
$ curl -X POST --data "{\"title\" \"Libro non valido\"}" \
http://localhost:8080/books
> HTTP/1.1 400 Bad Request
{
"status": 400,
"title": "Creazione del libro fallita",
"detail": "carattere non valido '\"' dopo la chiave dell'oggetto"
}