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