Getting Started with the Go Iris Web Framework

Instalación

Nota: Requiere Go versión 1.20 o superior.

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

Impórtalo en tu código:

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

Solución de problemas de instalación

Si encuentras errores de red durante la instalación, asegúrate de que la variable de entorno GOPROXY esté configurada con un valor válido.

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

Si los métodos anteriores no resuelven el problema, borra la caché del módulo go:

go clean --modcache

Inicio rápido

Modo Funcional

$ cat main.go
package main

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

func main() {
    // Define la instancia de iris
    app := iris.New()

    // Define un grupo de rutas, (aquí se define un grupo de rutas con un prefijo /books)
    booksAPI := app.Party("/books")
    {
        // Usa middleware
        booksAPI.Use(iris.Compression)

        // Establece rutas y controladores de ruta
        // GET: http://localhost:8080/books
        booksAPI.Get("/", list)
        // POST: http://localhost:8080/books
        booksAPI.Post("/", create)
    }

    // Escucha en el puerto
    app.Listen(":8080")
}

// Ejemplo de libro.
type Book struct {
    Title string `json:"title"`
}

func list(ctx iris.Context) {
    books := []Book{
        {"Dominando la concurrencia en Go"},
        {"Patrones de diseño en Go"},
        {"Go Black Hat"},
    }

    ctx.JSON(books)
    // Nota: Negociación de respuesta basada en la prioridad del servidor y la preferencia del cliente
    // en lugar 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: usa ctx.ReadBody(&b) para vincular datos entrantes de cualquier tipo.
    if err != nil {
        ctx.StopWithProblem(iris.StatusBadRequest, iris.NewProblem().
            Title("Error al crear el libro").DetailErr(err))
        // Nota: Usa ctx.StopWithError(código, err) cuando se espera una respuesta de texto plano solo en caso de error.
        return
    }

    println("Libro recibido: " + b.Title)

    ctx.StatusCode(iris.StatusCreated)
}

Patrón arquitectónico MVC

Importa el paquete MVC

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

Configura el controlador basado en el grupo de rutas

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

Implementación del controlador

type BookController struct {
    /* Inyección de dependencias */
}

// Responde a GET: http://localhost:8080/books
func (c *BookController) Get() []Book {
    return []Book{
        {"Dominando la concurrencia en Go"},
        {"Patrones de diseño en Go"},
        {"Sombrero negro Go"},
    }
}

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

    return iris.StatusCreated
}

Ejecuta tu servidor web Iris:

$ go run main.go
> Escuchando en: http://localhost:8080
> La aplicación ha iniciado. Presiona CTRL+C para apagar.

Lista de libros:

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

[
  {
    "title": "Dominando la concurrencia en Go"
  },
  {
    "title": "Patrones de diseño en Go"
  },
  {
    "title": "Sombrero negro Go"
  }
]

Crea un nuevo libro:

$ curl -i -X POST \
--header 'Content-Encoding:gzip' \
--header 'Content-Type:application/json' \
--data "{\"title\":\"Escribiendo un intérprete en Go\"}" \
http://localhost:8080/books

> HTTP/1.1 201 Creado

Este es un ejemplo de una respuesta error:

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

> HTTP/1.1 400 Solicitud Incorrecta

{
  "status": 400,
  "title": "Error en la creación del libro",
  "detail": "carácter '\"' inválido después de la clave del objeto"
}