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