后端Gin框架:
这是我参与【第五届青训营】伴学笔记创作活动的第8天。
1.一开始没办法使用go get:
go mod init main.go
解决:终端执行 go mod init xxx (xxx为文件名,如hello.go)
2.创建一个module
方法一
- 先创建一个go的项目
- 在去git创建对应的仓库用来存放module
- 在对应的文件夹下面输入:
go mod init github.com/xxxxx
git init
git remote add origin https://github.com/goxuetang/encodex.git
方法二
- new project的时候选择(GOPATH)
- 然后在项目里面选择new一个module文件资源,就能看到有一个go.mod了
3.Gin框架的基本知识:
1.最基本的:如何正确的import
- 在命令行中,输入对应的依赖包,比如输入:
go get github.com/gin-gonic/gin //来获取gin
2.创建一个默认的ginserver:
//创建一个服务
ginServer := gin.Default()
//加载静态页面
ginServer.LoadHTMLGlob("templates/*")
//加载资源文件
ginServer.Static("/static","./static")
//服务器端口
ginServer.Run(":8082")
3.创建一个最基础的GET访问请求
//访问地址,处理我们的请求,Request Response
//Gin RestFul 十分简单
//响应一个页面给前端
ginServer.GET("/index", func(context *gin.Context) {
//context.JSON() json数据
context.HTML(http.StatusOK,"index.html",gin.H{
"msg":"go后台传来的数据",
})
context.JSON(200,gin.H{"msg":"helloWorld"})
})
4.创建一个可以接受传参的请求
//接收前端传来的参数
//usl?userId=xx&username=Graves
//myHandler()引入了拦截器
ginServer.GET("user/info",func(context *gin.Context) {
userid :=context.Query("userid")
username := context.Query("username")
context.JSON(http.StatusOK,gin.H{
"userid": userid,
"username": username,
})
})
- 通过context来获取传入的值
5.可以用id,或者name
// /user/info/1/Graves
ginServer.GET("/user/info/:userid/:username", func(context *gin.Context) {
userid := context.Query("userid")
username := context.Query("username")
context.JSON(http.StatusOK,gin.H{
"userid": userid,
"username":username,
})
})
- 在写get的时候,用:userid,就可以实现直接写入用户的id,比如info/1这类
6.封装类的请求
- request.body这类的封装类,我们可以用GetRawData,获取到的是一个[]byte切片的数组
- 我们用map去接收返回的数组结果,记得interface{}的使用,用json的Unmarshal来获取数据
//前端传给后端json
ginServer.POST("/json", func(context *gin.Context) {
//request.body
//[]byte
data,_ :=context.GetRawData()
var m map[string]interface{}
//包装为json数据
_ = json.Unmarshal(data,&m)
context.JSON(http.StatusOK,m)
})
7.路由
- 路由重定向可以用context.Redirect来实现
- 我们可以创建一个404,当访问的页面不存在时,返回我们设定好的页面
//路由
ginServer.GET("/test", func(context *gin.Context) {
//重定向 301状态码
context.Redirect(http.StatusMovedPermanently,"https://www.baidu.com")
})
//404 NoRute 我们访问任何这个端口的页面,不存在的路径就会返回404
ginServer.NoRoute(func(context *gin.Context) {
context.HTML(http.StatusNotFound,"404.html",nil)
})
8.路由组设置
//路由组 /user/add
userGroup :=ginServer.Group("/user")
{
userGroup.GET("/add")
userGroup.GET("/login")
userGroup.GET("/logout")
}
9.拦截器
- 先自定义一个中间件
//自定义go中间件 拦截器
func myHandler() (gin.HandlerFunc) {
return func(context *gin.Context) {
//通过自定义的中间件,设置的值,在后续处理中只要调用了这个中间件的都可以拿到这里的参数
context.Set("usersession","userid-1")
context.Next()//放行
//context.Abort()//拦截阻止
}
}
- 然后在需要的函数加上我们自定义的函数
ginServer.GET("user/info",myHandler(), func(context *gin.Context) {
//取出中间件中的值 key
usersession := context.MustGet("usersession").(string)
log.Println("==============>",usersession)
userid :=context.Query("userid")
username := context.Query("username")
context.JSON(http.StatusOK,gin.H{
"userid": userid,
"username": username,
})
})