gin学习分享 (持续更新...)

gin学习笔记

gin是什么

gin是一个Go语言编写的Web框架,着重于提供一种简单、快速的方法来构建Web应用程序。它通过提供丰富的中间件支持、快速的路由功能、而著称。

gin的优点

  • gin的最大卖点是其高性能,它通过优化路由算法和减少内存分配来实现快速的HTTP请求处理
  • gin提供了一个清晰而简洁的API,使得开发者可以快速上手和构建Web应用。同时,它也提供了广泛的文档和社区支持,帮助开发者解决开发中的问题
  • 提供了许多定义好的中间件,有些是gin包里的,有些是二次开发的第三方包

gin的缺点

  • 高级功能较少,对大型项目支持较弱,许多高级功能需要开发者自己实现或者中间件帮助实现
  • 文档相对较少
  • 不支持原生的context
gin能做什么
  1. 常用于中小型web请求类服务的项目
gin怎么用
go get github.com/gin-gonic/gin 
常用函数和结构体

建立路由

// 返回一个默认的路由,默认路由带有logger和recover处理的中间件
defaultRoute := gin.Default() 
// 返回一个纯净的路由
pureRoute := gin.New() 

注:gin.Default()和gin.New()都有可选参数,参数是func(*gin.Engine)类型的切片, 参数用于加中间件修饰route;gin提供了r.Use()方法可以很方便的给route添加中间件,因此一般没必要入参

添加中间件

// 给当前路由组添加局部的组内中间件,如果是gin.New()或者gin.Default()返回的route,默认是"/"根路由下的全局中间件
r.Use() 
//按顺序逐个添加中间件
r.Use(m1)
r.Use(m2)
//一次性添加多个中间件
r.Use(m1,m2)
// 对某一个方法添加中间件
r.GET("/relativePath",m1,m2,func1)
r.GET("/relativePath",func1).Use(m1,m2)

中间件特殊操作

// 停止执行该中间件接下来的操作,并把后续操作入栈,等func1执行完后再出栈,类似于后置函数
context.Next()
// 不再往下运行后续的中间件和处理函数,但会把这个中间件函数运行完并返回rsp,常用于中间件过滤请求,如果前面的中间件有通过context.Next()入栈函数,也会按顺序执行
context.Abort()
// 用于中间件间的信息传递,get key-value
context.Get(key)
// 用于中间件间的信息传递,set key-value
context.Set(key, value)

// 中间件中使用 goroutine如果需要带context参数的话必须使用c.copy,不能使用原来的c,否则有可能出现并发问题

注:无需特地传参*gin.context上下文,gin框架对每个请求都会创建一个唯一的*gin.context.

设置路由组

// 在当前路由组的base路径下设置再路由组,即这个组的base路径为/${oldBasePath}/group1
group1Route := r.Group("/group1")
// 显示这个路由组的base路径
path := r.BasePath()

设置路由方法

// 设置GET方法,用于从服务器获取资源。通常用于请求数据,不应该对服务器状态产生影响
route.GET("/relativePath",m1)
// 设置POST方法,用于向服务器提交数据。用于提交表单数据、上传文件等操作,可能会对服务器状态产生影响
route.POST("/relativePath",m1)
// 设置PUT方法,用于向服务器上传数据,要求指定上传位置,用新的资源替换掉指定位置的资源
route.PUT("/relativePath",m1)
// 设置PATCH方法,部分更新资源,用于对资源进行局部更新
route.PATCH("/relativePath",m1)
// 设置HEAD方法,服务器只返回头部信息,不返回实际内容。常用于检查资源的状态或获取头部信息
route.HEAD("/relativePath",m1)
// 设置OPTIONS方法,请求服务器告知支持的请求方法、支持的头部信息等,用于查看服务器支持的功能
route.OPTIONS("/relativePath",m1)
// 设置DELETE方法,请求服务器删除指定的资源
route.DELETE("/relativePath",m1)
// 设置路由404返回方法
route.NoRoute(m1)
// 设置路由405返回方法
route.NoMethod(m1)
// 为该路由路径下的所有method(GET,POST,PUT,PATCH,HEAD,OPTIONS,DELETE,CONNECT,TRACE)设置同样的方法,一般搭配switch使用
route.Any("/relativePath",m1)
// 设置该路由该路径的任意方法
route.Handle("GET","/relativePath",m1)
// 显示这个route的所有路由方法
route.Routes()

设置访问静态资源(前端)

// 设置使用本地静态目录资源访问
route.Static("/relativePath","./static/dir")
// 设置使用自定义的http.FileSystem作为静态文件服务
route.StaticFS("/relativePath",http.Dir("./myStaticDir"))
// 设置使用本地静态文件资源访问
route.StaticFile("/relativePath","./static/dir/file")
// 设置使用自定义的http.FileSystem作为静态文件服务,并寻找到"filename"对应的文件
route.StaticFileFS("/relativePath","fileName",http.Dir("./myStaticDir"))

获得req的数据

//获取少量数据
// 获取url上的动态路由参数,例如定义路由GET("/user/:useId/:age",m1), useId和age是可以动态输入的参数,需要动态匹配的路径(值)前面加一个":"
context.Param(key)
// 获取url上的key value数据,在"?"后面的数据,多个key=value之间用"&"连接
context.(Get)Query(key)
// 获取表单上的key value数据
context.(Get)PostForm(key)
// 获取cookie信息
context.cookie(name)

//获取大量数据
//使用ShouldBind来将所有入参(query和form)和结构体绑定
//结构体可以使用form作为tag,form作为最低匹配优先级,即如果输入为json格式,且同时有json的tag,会匹配json的tag而不会匹配form的tag
// bind form-data、json...
context.ShouldBind(&bind)

// bind query and form-data
context.ShouldBindWith(&form, binding.Form)
// only bind query
context.ShouldBindWith(&formQ, binding.Query)
// only bind form-data
context.ShouldBindWith(&formMultipart, binding.FormMultipart)

// only bind url without query
context.ShouldBindUri(&url)
// only bind query
context.ShouldBindQuery(&query)

注:shouldbind读数据的时候,如果是Binding.Binding类型的数据,可以重复读,例如query,form等,如果是Binding.BindingBody类型的数据只能读一次,例如JSON,XML等。

重定向和转发

// 请求重定向
// 返回rsp示意客户端重定向到new_url,理论上code可以带任何状态码,但一般情况下都是携带301,302,303,307。这是个标准问题,返回别的code可能客户端没法正常处理.
//http.StatusMovedPermanently (301):用于永久重定向。
//http.StatusFound (302):用于临时重定向。
//http.StatusSeeOther (303):用于告诉客户端使用 GET 方法获取另一个 URL 的资源。
//http.StatusTemporaryRedirect (307):与 302 类似,但要求保持请求方法不变,通常用于 POST 请求的重定向
context.Redirect(code, new_url)
// 请求转发
// 修改新的转发地址,然后使用HandleContext方法继续流程。
context.Request.Url = new_url
context.HandleContext(context)

获取porm里的文件和文件上传

// 如果文件过大的情况下,需要调整route允许接受的parm的最大内存大小(byte)
route.MaxMultipartMemory int64
// 获取表单上提供的文件句柄, fileName跟formKey没有关系
file,_ = context.FormFile(form-key)
// 获取表单上提供的多个文件句柄,mulFile是一个file的切片
mulFile,_ =context.MultipartForm()
// 存文件到本地服务器
context.SaveUploadedFile(file, dstPath)

学习过程中的其他问题:

  1. http里get, put, post, delete等方法描述的资源其实就是url指向的资源,改动是对该url指向的资源的改动, 跟后端是否又指向了别的资源或者处理了其他数据没有关系,因此理论上post可以完成后端数据的增删查改(但不是对该url指向的资源)
  2. get,delete的请求消息(key-value)在url里,post,put,patch的请求消息(key-value)在表单/body里.
  3. 请求转发和请求重定向是有区别的,前者是用户发送请求到网址A,然后把网址A这个请求转发到网址B,请求只有一个,url地址栏是不变的,响应也只有一个,数据是共享的,速度比较快,请求转发常用于访问内部资源;后者是用户发送请求到网址A,然后把网址A将重定向请求返回给用户,用户再发请求到网址B,请求会有两个,url地址栏是改变的,响应不只一个,两个网址收到的req的数据是不共享的,因为两次请求,所以速度较慢,重定向一般用于访问站外资源。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值