Rozpoczęcie pracy z frameworkiem internetowym Go Iris

Instalacja

Uwaga: Wymagana wersja Go 1.20 lub nowsza.

$ mkdir myapp
$ cd myapp
$ go mod init myapp
$ go get github.com/kataras/iris/v12@latest

Zaimportuj to w swoim kodzie:

import "github.com/kataras/iris/v12"

Rozwiązywanie problemów z instalacją

Jeśli podczas instalacji napotkasz błędy sieciowe, upewnij się, że zmienna środowiskowa GOPROXY jest ustawiona na prawidłową wartość.

go env -w GOPROXY=https://goproxy.io,direct

Jeśli powyższe metody nie rozwiązują problemu, wyczyść pamięć podręczną modułu go:

go clean --modcache

Szybki start

Tryb funkcyjny

$ cat main.go
package main

import "github.com/kataras/iris/v12"

func main() {
    // Zdefiniuj instancję iris
    app := iris.New()

    // Zdefiniuj grupę tras, (tutaj zdefiniuj grupę tras z prefiksem /books)
    booksAPI := app.Party("/books")
    {
        // Użyj oprogramowania pośredniczącego
        booksAPI.Use(iris.Compression)

        // Ustaw trasy i obsługę tras
        // GET: http://localhost:8080/books
        booksAPI.Get("/", list)
        // POST: http://localhost:8080/books
        booksAPI.Post("/", create)
    }

    // Nasłuchuj na porcie
    app.Listen(":8080")
}

// Przykład książki.
type Book struct {
    Title string `json:"title"`
}

func list(ctx iris.Context) {
    books := []Book{
        {"Opanowanie współbieżności w Go"},
        {"Wzorce projektowe w Go"},
        {"Czarna magia Go"},
    }

    ctx.JSON(books)
    // Uwaga: Negocjacja odpowiedzi bazuje na priorytecie serwera i preferencjach klienta
    // zamiast używania ctx.JSON:
    // ctx.Negotiation().JSON().MsgPack().Protobuf()
    // ctx.Negotiate(books)
}

func create(ctx iris.Context) {
    var b Book
    err := ctx.ReadJSON(&b)
    // Uwaga: użyj ctx.ReadBody(&b), aby powiązać przychodzące dane dowolnego typu.
    if err != nil {
        ctx.StopWithProblem(iris.StatusBadRequest, iris.NewProblem().
            Title("Nie udało się utworzyć książki").DetailErr(err))
        // Uwaga: użyj ctx.StopWithError(code, err), jeśli oczekujesz odpowiedzi w zwykłym formacie tylko w przypadku błędu.
        return
    }

    println("Otrzymano książkę: " + b.Title)

    ctx.StatusCode(iris.StatusCreated)
}

Wzorzec architektury MVC

Importuj pakiet MVC

import "github.com/kataras/iris/v12/mvc"

Ustaw kontroler na podstawie grupy tras

m := mvc.New(booksAPI)
m.Handle(new(KontrolerKsiazek))

Implementacja kontrolera

type KontrolerKsiazek struct {
    /* Wstrzyknięcia zależności */
}

// Odpowiedz na żądanie GET: http://localhost:8080/books
func (c *KontrolerKsiazek) Get() []Ksiazka {
    return []Ksiazka{
        {"Zrozumieć równoległość w Go"},
        {"Wzorce projektowe w Go"},
        {"Czarna magia Go"},
    }
}

// Odpowiedz na żądanie POST: http://localhost:8080/books
func (c *KontrolerKsiazek) Post(b Ksiazka) int {
    println("Otrzymano książkę: " + b.Tytul)

    return iris.StatusCreated
}

Uruchom serwer sieciowy Iris:

$ go run main.go
> Słuchanie na: http://localhost:8080
> Aplikacja została uruchomiona. Naciśnij CTRL+C, aby ją zamknąć.

Wylistuj książki:

$ curl --header 'Accept-Encoding:gzip' http://localhost:8080/books

[
  {
    "tytul": "Zrozumieć równoległość w Go"
  },
  {
    "tytul": "Wzorce projektowe w Go"
  },
  {
    "tytul": "Czarna magia Go"
  }
]

Stwórz nową książkę:

$ curl -i -X POST \
--header 'Content-Encoding:gzip' \
--header 'Content-Type:application/json' \
--data "{\"tytul\":\"Pisanie interpretera w Go\"}" \
http://localhost:8080/books

> HTTP/1.1 201 Created

To jest przykład odpowiedzi z błędem:

$ curl -X POST --data "{\"tytul\" \"Niepoprawna Książka\"}" \
http://localhost:8080/books

> HTTP/1.1 400 Bad Request

{
  "status": 400,
  "tytul": "Błąd podczas tworzenia książki",
  "szczegoly": "nieprawidłowy znak '\"' po kluczu obiektu"
}