web框架:Iris快速入门
1 介绍及安装
- 介绍
- Iris是一款用Go开发的web应用框架,被称为速度最快的Go后端开发框架。
- 官网地址:https://www.iris-go.com/
- 中文教程地址:http://www.codebaoku.com/iris/iris-index.html
- 安装
环境要求:iris 框架要求 golang 版本至少为1.8。可以通过打开终端,执行:go version 命令来查看自己机器的go环境版本。
安装 iris 框架非常简单,使用 go 语言的全局安装第三方代码的命令 get 即可。
go get -u github.com/kataras/iris
- 启动一个简单的iris服务
package main
import "github.com/kataras/iris"
func main() {
//1. 创建app结构体对象
app := iris.New()
//2. 端口监听
app.Run(iris.Addr(":8082"))
}
bug:
Assets undefined (type *blocks.Blocks has no field or method Assets)
- 解决办法:
- 根据对应路径删除kataras目录
- 在对应路径下执行go mod init
- 重新下载指定版本
go get github.com/kataras/iris/v12@latest
// 或者
go get github.com/kataras/iris/v12@master
2 RESTFul风格、请求参数、响应处理
2.1 RESTFul风格【GET、POST…】
- HTTP1.0定义了三种请求方法:GET、POST、HEAD
- HTTP1.1新增了五种方法:OPTIONS、PUT、DELETE、TRACE、CONNECT
因此,目前HTTP一共定义了八种方法对应不同的资源操作方式
package main
import (
"github.com/kataras/iris/v12"
_ "github.com/kataras/iris/v12"
"github.com/kataras/iris/v12/context"
"net/http"
)
func main() {
//创建实例
app := iris.New()
//RESTFul请求方式
//1. GET
app.Get("/user", func(context *context.Context) {
path := context.Path()
app.Logger().Info(path)
context.JSON(map[string]interface{}{
"code": http.StatusOK,
"msg": "处理get请求成功,查询用户信息",
})
})
//2. 处理POST
app.Post("/user", func(context *context.Context) {
path := context.Path()
context.WriteString("处理POST请求成功,请求路径:" + path)
})
//3. 其他请求方式同理
//监听端口
app.Run(iris.Addr(":8082"))
}
- GET:
- POST结果:
2.2 请求参数处理
package main
import (
"github.com/kataras/iris/v12"
_ "github.com/kataras/iris/v12"
"github.com/kataras/iris/v12/context"
)
func main() {
//创建实例
app := iris.New()
//请求参数处理
//1. param //localhost:8082/testParam?username=zhangsan&password=123
app.Get("/testParam", func(context *context.Context) {
username := context.URLParam("username")
password := context.URLParam("password")
//返回html数据格式
context.HTML("<h1>" + username + "," + password + "</h1>")
})
//2. PathVariable //localhost:8082/testPathVariable/wangwu/13
//app.Get("/testPathVariable/{username:string}/{age:int}") //限定请求参数类型 username:string 、 age:int
app.Get("/testPathVariable/{username}/{password}", func(context *context.Context) {
username := context.Params().Get("username")
password := context.Params().Get("password")
context.WriteString("响应成功:" + username + "," + password)
})
//3. form表单
app.Post("/testForm", func(context *context.Context) {
username := context.PostValue("username")
pwd := context.PostValue("password")
context.WriteString("接收表单数据成功:" + username + "," + pwd)
})
//4. JSON数据
app.Post("/testJson", func(context *context.Context) {
var person Person
if err := context.ReadJSON(&person); err != nil {
panic(err.Error())
}
context.Writef("接收JSON数据成功:%v", person)
})
//5. XMl格式数据
app.Post("/testXML", func(context *context.Context) {
var stu Student
if err := context.ReadXML(&stu); err != nil {
panic(err.Error())
}
context.Writef("接收XML数据成功:%v", stu)
})
//监听端口
app.Run(iris.Addr(":8082"))
}
// 用于解析JSON
type Person struct {
//字段需要是大写,否则为私有,底层无法设置值
Name string `json:name`
Pwd string `json:pwd`
}
// 用于解析XML
type Student struct {
Name string `xml:stu_name`
Age int `xml:stu_age`
}
- form表单:
- JSON数据:
2.3 响应结果处理
package main
import (
"github.com/kataras/iris/v12"
_ "github.com/kataras/iris/v12"
"github.com/kataras/iris/v12/context"
)
func main() {
//创建实例
app := iris.New()
//响应参数处理
//1. 返回HTML数据
app.Get("/getHtml", func(context *context.Context) {
context.HTML("<h1> 返回HTML数据成功</h1>")
})
//2. 返回json数据
app.Get("/getJson", func(context *context.Context) {
context.JSON(iris.Map{"code": 200, "msg": "返回json数据成功"})
})
//3. 返回XMl数据
app.Get("/getXMl", func(context *context.Context) {
context.XML(Student{StuName: "jackson", StuAge: 25})
})
//4. 返回string类型
app.Get("/getString", func(context *context.Context) {
context.WriteString("返回string类型数据成功")
})
//监听端口
app.Run(iris.Addr(":8082"))
}
// 用于解析JSON
type Person struct {
//字段需要是大写,否则为私有,底层无法设置值
Name string `json:name`
Pwd string `json:pwd`
}
// 用于解析XML
type Student struct {
StuName string `xml:stu_name`
StuAge int `xml:stu_age`
}
- 返回XML格式数据
3 路由功能
package main
import (
"github.com/kataras/iris/v12"
_ "github.com/kataras/iris/v12"
"github.com/kataras/iris/v12/context"
)
func main() {
//创建实例
app := iris.New()
//路由功能
//1. handle方式处理请求 [method:GET、POST等都行]
app.Handle("GET", "/userinfo", func(context *context.Context) {
context.WriteString("handle方式处理请求成功...")
})
//2. 自定义表达式获取路由
app.Get("/api/users/{userid:uint64}", func(context *context.Context) {
userId, err := context.Params().GetUint("userid")
if err != nil {
context.JSON(iris.Map{
"code": 201,
"msg":"bad request",
})
}
context.Writef("处理请求成功:%v", userId)
})
//3. 路由组
userParty := app.Party("/users", func(context *context.Context) {
//处理下一级请求
context.Next()
})
// URL: localhost:8082/users/login
userParty.Get("/login", func(context *context.Context) {
context.Writef("处理登录请求成功,请求路径:%v", context.Path())
})
goodsParty := app.Party("/goods", userMiddleware)
goodsParty.Post("/add", func(context *context.Context) {
context.WriteString("添加商品成功..." + context.Path())
})
//监听端口
app.Run(iris.Addr(":8082"))
}
//用户路由中间件【拦截器】
func userMiddleware(context iris.Context) {
context.Next()
}
4 iris配置处理(读取配置文件)
package main
import (
"github.com/kataras/iris/v12"
)
func main() {
app := iris.New()
//1. 通过代码进行全局配置
app.Configure(iris.WithConfiguration(iris.Configuration{
//如果设置为true,当人为中断程序执行之,则不会自动正常将服务器关闭,如果设置为false,需要自己自定义处理
DisableInterruptHandler: false,
//是否路由重定向,默认为false
DisablePathCorrection: false,
EnablePathEscape: false,
FireMethodNotAllowed: false,
DisableBodyConsumptionOnUnmarshal: false,
DisableAutoFireStatusCode: false,
TimeFormat: "Mon,02 Jan 2006 15:04:05 GMT",
Charset: "utf-8",
}))
//2. 通过配置文件读取【需要在run方法之前执行】
//toml
app.Configure(iris.WithConfiguration(iris.TOML("/Users/iris/configs/iris.toml")))
//yml
app.Configure(iris.WithConfiguration(iris.TOML("/Users/iris/configs/iris.yml")))
//json
app.Configure(iris.WithConfiguration(iris.TOML("/Users/iris/configs/iris.json")))
app.Run(iris.Addr(":8082"))
}