青训营笔记

87 阅读2分钟

后端Gin框架:

这是我参与【第五届青训营】伴学笔记创作活动的第8天。

1.一开始没办法使用go get:

go mod init main.go

解决:终端执行 go mod init xxx (xxx为文件名,如hello.go)

2.创建一个module

方法一

  1. 先创建一个go的项目
  2. 在去git创建对应的仓库用来存放module
  3. 在对应的文件夹下面输入:
go mod init github.com/xxxxx

git init  

git remote add origin https://github.com/goxuetang/encodex.git

方法二

  1. new project的时候选择(GOPATH)
  2. 然后在项目里面选择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,
		})
	})