一架梯子,一头程序猿,仰望星空!
Iris Web框架教程 > 内容正文

Go Iris快速入门


本章介绍Go iris Web框架快速入门示例。

安装iris

提示:要求Go版本1.20及以上。

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

在你的代码中导入它:

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

安装问题解决

如果安装过程中出现网络错误,请确保设置了有效的GOPROXY环境变量。

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

如果以上方法都没有解决问题,请清除go模块缓存:

go clean --modcache

快速入门

函数式模式

$ cat main.go
package main

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

func main() {
    // 定义iris实例
    app := iris.New()

    // 定义路由组,(Party就是定义路由分组的意思,这里定义了一个/books前置的路由组)
    booksAPI := app.Party("/books")
    {
        // 使用中间件
        booksAPI.Use(iris.Compression)

        // 设置路由和路由处理函数
        // GET: http://localhost:8080/books
        booksAPI.Get("/", list)
        // POST: http://localhost:8080/books
        booksAPI.Post("/", create)
    }

    // 监听端口
    app.Listen(":8080")
}

// 书籍示例。
type Book struct {
    Title string `json:"title"`
}

func list(ctx iris.Context) {
    books := []Book{
        {"掌握Go并发"},
        {"Go设计模式"},
        {"黑帽子Go"},
    }

    ctx.JSON(books)
    // 提示:根据服务器的优先级和客户端的要求进行响应的协商
    // 而不是使用ctx.JSON:
    // ctx.Negotiation().JSON().MsgPack().Protobuf()
    // ctx.Negotiate(books)
}

func create(ctx iris.Context) {
    var b Book
    err := ctx.ReadJSON(&b)
    // 提示:使用ctx.ReadBody(&b)绑定任何类型的传入数据。
    if err != nil {
        ctx.StopWithProblem(iris.StatusBadRequest, iris.NewProblem().
            Title("图书创建失败").DetailErr(err))
        // 提示:当只期望在发生错误时得到纯文本响应时,使用ctx.StopWithError(code, err)。
        return
    }

    println("接收到的书籍: " + b.Title)

    ctx.StatusCode(iris.StatusCreated)
}

MVC架构模式

导入MVC包

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

在路由组基础上设置控制器

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

控制器实现

type BookController struct {
    /* 依赖注入 */
}

// 响应 GET: http://localhost:8080/books
func (c *BookController) Get() []Book {
    return []Book{
        {"掌握Go并发"},
        {"Go设计模式"},
        {"黑帽子Go"},
    }
}

// 响应 POST: http://localhost:8080/books
func (c *BookController) Post(b Book) int {
    println("接收到的书籍: " + b.Title)

    return iris.StatusCreated
}

运行你的Iris Web服务器:

$ go run main.go
> 现在监听中: http://localhost:8080
> 应用已启动。按CTRL+C关闭。

列举书籍:

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

[
  {
    "title": "掌握Go并发"
  },
  {
    "title": "Go设计模式"
  },
  {
    "title": "黑帽子Go"
  }
]

创建一本新书:

$ curl -i -X POST \
--header 'Content-Encoding:gzip' \
--header 'Content-Type:application/json' \
--data "{\"title\":\"用Go编写解释器\"}" \
http://localhost:8080/books

> HTTP/1.1 201 Created

这是一个错误响应的样式:

$ curl -X POST --data "{\"title\" \"无效的书籍\"}" \
http://localhost:8080/books

> HTTP/1.1 400 Bad Request

{
  "status": 400,
  "title": "图书创建失败"
  "detail": "object key后面的无效字符 '\"'",
}