go语言除了原生http web框架,还有3个比较出名的框架,gin,beego,Iris
先创建项目
创建go.mod文件,管理各种包
打开命令行,下载iris包,go get github.com/kataras/iris/v12@master
记得配置goproxy,防止下载失败
成功创建项目demo1
写入以下代码运行后,浏览器可以正常访问。
package main
import "github.com/kataras/iris/v12"
func main() {
app := iris.New() //开启iris http服务
app.Use(iris.Compression) //iris.Compression 是Iris内部对IO数据进行压缩的模块,可以提高数据传输速度。
app.Get("/", func(ctx iris.Context) {
ctx.HTML("Hello <strong>%s</strong>!", "World")
})
app.Listen(":8080") //监听端口
}
Restful规范
定义一种接口的设计规范,但并不是必须用这个规范,根据实际场景来,不要墨守成规
表单传参
app.Post("/user/login", func(c *context.Context) {
//获取表单的参数
username := c.PostValue("username")
password := c.PostValue("password")
//控制台输出的日志
app.Logger().Info(username + "--" + password)
//对浏览器响应的内容
c.WriteString(username + "--" + password)
})
路径传参带key
app.Get("/user", func(context *context.Context) {
userId := context.URLParam("userId")
userName := context.URLParam("userName")
app.Logger().Info(userId + "--" + userName)
context.WriteString(userId + "--" + userName)
})
路径传参不带key
//路径传参
app.Get("/user/{userid:int64}/{username:string}", func(context *context.Context) {
userid := context.Params().Get("userid")
username := context.Params().Get("username")
app.Logger().Info(userid + "--" + username)
context.WriteString(userid + "--" + username)
})
传递json
app.Post("user/json", func(context *context.Context) {
//创建结构体,映射json字段,此处用匿名的,减少内存损耗,不匿名也可以
var user1 = struct {
Username string `json:"username"`
Password string `json:"password"`
}{}
//读json赋值给user
err := context.ReadJSON(&user1)
if err != nil {
panic(err)
}
app.Logger().Info(user1)
//返回给浏览器json,iris.map是一个转换json的方法
context.JSON(iris.Map{"msg": user1.Username, "code": 200})
})
路由组
类似前缀,关键词Party,并且可以写方法,类似init
页面跳转
目录结构如下
代码如下:
package main
import (
"github.com/kataras/iris/v12"
"github.com/kataras/iris/v12/context"
"net/http"
)
func main() {
app := iris.New()
app.Use(iris.Compression)
//页面渲染配置,从./view目录下加载扩展名是.html的所有模板,将reload设置为true可以热更新前端页面
app.RegisterView(iris.HTML("./view", ".html").Reload(true))
//静态资源目录设置
app.HandleDir("static", http.Dir("./static"))
app.Get("/index", func(context *context.Context) {
context.ViewData("msg", "hello,dada")
context.View("index.html")
})
app.Run(iris.Addr(":8080"))
}
错误页面响应
//如果报404的处理逻辑
app.OnErrorCode(iris.StatusNotFound, func(context *context.Context) {
context.View("404.html")
})
重定向
进入/index,如果login为false就重定向到login
app.Get("/index", func(context *context.Context) {
context.ViewData("msg", "hello,dada")
login := false
if login {
fmt.Println("xxx")
} else {
//设置重定向状态码302给context
context.StatusCode(302)
//设置重定向的地址,location为/login
context.Header("location", "/login")
}
})
app.Get("/login", func(context *context.Context) {
context.View("login.html")
})
中间件
访问user之前或之后的操作,也可以指定为全局
package main
import (
"fmt"
"github.com/kataras/iris/v12"
"github.com/kataras/iris/v12/context"
)
func main() {
app := iris.New()
app.Use(iris.Compression)
//全局的前置处理
app.Use(befer)
//全局的后置处理
app.Use(after)
app.Get("/user", user)
//app.Get("/user",befer,user,after) 只针对user的前置,后置处理
app.Listen(":8080")
}
func user(c *context.Context) {
fmt.Println("user")
c.Next()
}
func befer(c *context.Context) {
c.Values().Set("msg", "hellodada")
fmt.Println("befer")
//继续到下一个处理器,不写的话,不会到下一个
c.Next()
}
func after(c *context.Context) {
fmt.Println("after")
fmt.Println(c.Values().Get("msg"))
c.Next()
}
会话
以下代码模拟会话,用户登录后,服务端给客户端一个cookie,并且服务端有一个session,验证通过后,可以正常登录首页,可以通过注销或者消除会话方法进行退出。
package main
import (
"github.com/kataras/iris/v12"
"github.com/kataras/iris/v12/context"
"github.com/kataras/iris/v12/sessions"
)
// 创建会话
var (
cookie = "sessonididid"
session = sessions.New(sessions.Config{Cookie: cookie})
)
func main() {
app := iris.New()
app.Use(iris.Compression)
app.Get("/index", index)
app.Get("/login", login)
app.Get("/logout", logout)
app.Get("/destroy", destroy)
app.Listen(":8080")
}
// 登录验证
func login(c *context.Context) {
//将c与seesion建立连接
sessions := session.Start(c)
//身份验证逻辑判断
//验证通过,给session赋值,true
sessions.Set("authenticated", true)
}
// 首页
func index(context *context.Context) {
sessions := session.Start(context)
//检查是否通过登录验证
boolean, _ := sessions.GetBoolean("authenticated")
if boolean == false {
//响应302
context.StatusCode(iris.StatusForbidden)
return
}
context.WriteString("用户已经通过验证")
}
// 销毁会话
func destroy(c *context.Context) {
//类似close,也可以起到注销的效果
session.Destroy(c)
}
// 注销
func logout(c *context.Context) {
sessions := session.Start(c)
//将存的authenticated改为false
sessions.Set("authenticated", false)
}