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"))
}
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`
}
示例:
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`
}
package main
import (
"github.com/aobco/log"
"github.com/kataras/iris/v12"
"github.com/kataras/iris/v12/context"
)
// 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 User
err := 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)
})
//③处理PathVariable
app.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)
})
//④处理URLParam
app.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 User
err := 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)
})
//监听8082端口
app.Run(iris.Addr(":8082"))
}
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"))
}
5 mvc包的使用
package main
import (
"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"))
}
结果:
6 session的使用和控制
package main
import (
"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"))
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/148504.html