Introdução

O Go Iris Web Framework é uma estrutura poderosa para desenvolvimento web em Go.

Instalação

Nota: Requer a versão 1.20 ou superior do Go.

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

Importe no seu código:

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

Solução de Problemas na Instalação

Se encontrar erros de rede durante a instalação, verifique se a variável de ambiente GOPROXY está definida como um valor válido.

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

Se os métodos acima não resolverem o problema, limpe o cache do módulo go:

go clean --modcache

Início Rápido

Modo Funcional

$ cat main.go
package main

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

func main() {
    // Define a instância iris
    app := iris.New()

    // Define um grupo de rotas, (aqui define um grupo de rotas com o prefixo /books)
    booksAPI := app.Party("/books")
    {
        // Use middleware
        booksAPI.Use(iris.Compression)

        // Defina rotas e manipuladores de rota
        // GET: http://localhost:8080/books
        booksAPI.Get("/", list)
        // POST: http://localhost:8080/books
        booksAPI.Post("/", create)
    }

    // Escute na porta
    app.Listen(":8080")
}

// Exemplo de livro.
type Book struct {
    Title string `json:"title"`
}

func list(ctx iris.Context) {
    books := []Book{
        {"Dominando a Concorrência em Go"},
        {"Padrões de Design em Go"},
        {"Black Hat Go"},
    }

    ctx.JSON(books)
    // Nota: Negociação da resposta com base na prioridade do servidor e na preferência do cliente
    // em vez de usar ctx.JSON:
    // ctx.Negotiation().JSON().MsgPack().Protobuf()
    // ctx.Negotiate(books)
}

func create(ctx iris.Context) {
    var b Book
    err := ctx.ReadJSON(&b)
    // Nota: use ctx.ReadBody(&b) para vincular dados de entrada de qualquer tipo.
    if err != nil {
        ctx.StopWithProblem(iris.StatusBadRequest, iris.NewProblem().
            Title("Falha ao criar livro").DetailErr(err))
        // Nota: Use ctx.StopWithError(código, err) ao esperar somente uma resposta de texto simples em caso de erro.
        return
    }

    println("Livro recebido: " + b.Title)

    ctx.StatusCode(iris.StatusCreated)
}

Padrão Arquitetural MVC

Importe o pacote MVC

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

Configure o controlador com base no grupo de rotas

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

Implementação do Controlador

type BookController struct {
    /* Injeção de Dependência */
}

// Responder a GET: http://localhost:8080/books
func (c *BookController) Get() []Book {
    return []Book{
        {"Dominando a Concorrência em Go"},
        {"Padrões de Design em Go"},
        {"Go para Hackers"},
    }
}

// Responder a POST: http://localhost:8080/books
func (c *BookController) Post(b Book) int {
    println("Livro recebido: " + b.Title)

    return iris.StatusCreated
}

Execute seu servidor Web Iris:

$ go run main.go
> Ouvindo em: http://localhost:8080
> Aplicação iniciada. Pressione CTRL+C para desligar.

Liste os livros:

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

[
  {
    "title": "Dominando a Concorrência em Go"
  },
  {
    "title": "Padrões de Design em Go"
  },
  {
    "title": "Go para Hackers"
  }
]

Crie um novo livro:

$ curl -i -X POST \
--header 'Content-Encoding:gzip' \
--header 'Content-Type:application/json' \
--data "{\"title\":\"Escrevendo um Interpretador em Go\"}" \
http://localhost:8080/books

> HTTP/1.1 201 Created

Este é um exemplo de resposta de erro:

$ curl -X POST --data "{\"title\" \"Livro Inválido\"}" \
http://localhost:8080/books

> HTTP/1.1 400 Bad Request

{
  "status": 400,
  "title": "Falha na criação do livro",
  "detail": "caractere inválido '\"' após a chave do objeto"
}