本章介绍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后面的无效字符 '\"'",
}