web框架:Iris快速入门
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 github.com/kataras/iris/v12@master
//go get -u github.com/kataras/iris
- 启动一个简单的iris服务
package mainimport "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 mainimport ("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. GETapp.Get("/user", func(context *context.Context) {path := context.Path()app.Logger().Info(path)context.JSON(map[string]interface{}{"code": http.StatusOK,"msg": "处理get请求成功,查询用户信息",})})//2. 处理POSTapp.Post("/user", func(context *context.Context) {path := context.Path()context.WriteString("处理POST请求成功,请求路径:" + path)})//3. 其他请求方式同理//监听端口app.Run(iris.Addr(":8082"))
}
- GET:
- POST结果:
2.2 请求参数处理
2.2.1 json、xml、form等
package mainimport ("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=123app.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:intapp.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 Personif 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 Studentif 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.2.2 处理文件请求、文件下载等
```go
package mainimport ("github.com/aobco/log""github.com/kataras/iris/v12""github.com/kataras/iris/v12/context""path/filepath"
)// User 传输XML格式的时候需要把最外层的<user></user>带上
type User struct {Id int `json:"id" xml:"id"`Name string `json:"name" xml:"name"`
}func main() {/*处理请求参数*///创建iris对象app := iris.New()//①处理json请求参数app.Post("/handleJson", func(context *context.Context) {var user Usererr := context.ReadJSON(&user)if err != nil {context.WriteString("invalid Json...")context.StatusCode(iris.StatusBadRequest)return}context.WriteString("handle json request param success...")log.Infof("user=%v", user)})//②处理form请求参数app.Post("/handleForm", func(c *context.Context) {name := c.FormValue("name")age := c.FormValue("age")c.WriteString("handle form request param success...")log.Infof("name=%v, age=%v", name, age)})//③处理PathVariableapp.Get("/users/{id:int}", func(ctx *context.Context) {id, err := ctx.Params().GetInt("id")if err != nil {ctx.WriteString("handle pathVariable failed...")return}ctx.WriteString("handle pathVariable param success...")log.Infof("handle pathVariable success...id=%v", id)})//④处理URLParamapp.Get("/users", func(ctx *context.Context) {name := ctx.URLParam("name")age := ctx.URLParam("age")ctx.WriteString("handle URLParam success...")log.Infof("name=%v, age=%v", name, age)})//⑤解析XML//<user>// <id>3</id>// <name>unmard</name>//</user>app.Post("/handleXML", func(ctx *context.Context) {var user Usererr := ctx.ReadXML(&user)if err != nil {ctx.WriteString("handle XML err...")ctx.StatusCode(iris.StatusBadRequest)return}ctx.WriteString("handle XML success...")log.Infof("user=%v", user)})//⑥解析文件// 处理文件上传app.Post("/handleFile/upload", iris.LimitRequestBodySize(10*1024), func(ctx iris.Context) {// Get the file from the request.file, fileHeader, err := ctx.FormFile("uploadfile")if err != nil {ctx.StatusCode(iris.StatusInternalServerError)ctx.HTML("Error while uploading: <b>" + err.Error() + "</b>")return}defer file.Close()//_, err = ctx.SaveFormFile(fileHeader, filepath.Join("./upload", fileHeader.Filename))//用绝对路径代替,本地run,go会在项目根目录寻找_, err = ctx.SaveFormFile(fileHeader, filepath.Join("E:\\Go\\GoPro\\src\\go_code\\gouitest\\a-mime\\iris\\upload", fileHeader.Filename))if err != nil {ctx.StatusCode(iris.StatusInternalServerError)ctx.HTML("Error while uploading: <b>" + err.Error() + "</b>")return}ctx.WriteString("文件上传成功")})//处理文件下载app.Get("/handleFile/download", func(ctx *context.Context) {file := "E:\\Go\\GoPro\\src\\go_code\\gouitest\\a-mime\\image-v2.txt"err := ctx.SendFile(file, "txtFile.txt")if err != nil {ctx.WriteString("download file err")log.Errorf("download file err=%v", err)return}})//监听8082端口app.Run(iris.Addr(":8082"))
}
2.3 响应结果处理
package mainimport ("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 mainimport ("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/loginuserParty.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 mainimport ("github.com/kataras/iris/v12"
)func main() {app := iris.New()//1. 通过代码进行全局配置app.Configure(iris.WithConfiguration(iris.Configuration{//如果设置为true,当人为中断程序执行之,则不会自动正常将服务器关闭,如果设置为false,需要自己自定义处理DisableInterruptHandler: false,//是否路由重定向,默认为falseDisablePathCorrection: false,EnablePathEscape: false,FireMethodNotAllowed: false,DisableBodyConsumptionOnUnmarshal: false,DisableAutoFireStatusCode: false,TimeFormat: "Mon,02 Jan 2006 15:04:05 GMT",Charset: "utf-8",}))//2. 通过配置文件读取【需要在run方法之前执行】//tomlapp.Configure(iris.WithConfiguration(iris.TOML("/Users/iris/configs/iris.toml")))//ymlapp.Configure(iris.WithConfiguration(iris.TOML("/Users/iris/configs/iris.yml")))//jsonapp.Configure(iris.WithConfiguration(iris.TOML("/Users/iris/configs/iris.json")))app.Run(iris.Addr(":8082"))
}
5 mvc包的使用
package mainimport ("github.com/kataras/iris/v12""github.com/kataras/iris/v12/mvc"
)//controller
type UserController struct{}//1. controller中对应的GetInfo方法
//iris的mvc包中会自动为我们匹配,例如:GetInfo方法会为我们匹配 http://localhost:8082/info [GET请求]
func (uc *UserController) GetInfo() mvc.Result {iris.New().Logger().Info("get请求,请求路径为info")return mvc.Response{Object: map[string]interface{}{"code": 1,"message": "请求成功",},}
}//localhost:8082 [GET请求]
func (uc *UserController) Get() string {iris.New().Logger().Info("Get请求")return "UserController匹配get请求成功...."
}//注意:只能首字母大写,如果写成POST则匹配不到
func (uc *UserController) Post() string {iris.New().Logger().Info("post请求")return "UserController匹配post请求成功...."
}type BookController struct{}func (bc *BookController) Put() string {iris.New().Logger().Info("bookController 接收到put请求")return "bookController 匹配put请求成功..."
}func main() {app := iris.New()//mvc 包的使用//mvc.Configure(app.Party("/user))//将UserController绑定到mvc上mvc.New(app).Handle(new(UserController))mvc.New(app).Handle(new(BookController))app.Run(iris.Addr(":8082"))
}
结果:
- UserController.Get()
- UserController.GetInfo()
- BookController.Put()
6 session的使用和控制
package mainimport ("github.com/kataras/iris/v12""github.com/kataras/iris/v12/context""github.com/kataras/iris/v12/sessions"
)var (USERNAME = "username"ISLOGIN = "isLogin"
)func main() {app := iris.New()//session的使用//1. 创建session并进行使用sessionID := "mySession"sess := sessions.New(sessions.Config{Cookie: sessionID,})/*【1】用户登录功能,登录成功之后保存session*/app.Post("/login", func(context *context.Context) {userName := context.PostValue("name")passwd := context.PostValue("pws")if userName == "jack" && passwd == "123" {//向session中设置值session := sess.Start(context)session.Set(USERNAME, userName)session.Set(ISLOGIN, true)context.WriteString("账户登录成功")} else {session := sess.Start(context)session.Set(ISLOGIN, false)context.WriteString("账户登录失败, 请重新尝试")}})/*【2】用户退出之后,删除sessino*/app.Get("/logout", func(context *context.Context) {session := sess.Start(context)//删除session中的数据session.Delete(ISLOGIN)context.WriteString("退出登录成功.....")})/*【3】查询用户登录信息*/app.Get("/query", func(context *context.Context) {session := sess.Start(context)//查询用户是否登录【ISLOGIN是bool类型,因此这里直接通过GetBoolean】isLogin, err := session.GetBoolean(ISLOGIN)if err != nil {context.WriteString("账户未登录,请先登录")}if isLogin {username := session.GetString(USERNAME)context.WriteString("账户信息:" + username)} else {context.WriteString("账户未登录")}})app.Run(iris.Addr(":50000"))
}
-
登录请求
-
查询用户信息
-
退出登录
-
查询用户信息