gin框架复习

# gin框架

go的流行web框架有很多,每个都有自己的特色

Gin号称最快的go语言web框架,是目前官方推荐的框架,简洁,拓展稳定性能都比较出色

iris性能比gin好一些,支持MVC,但评价不太好,使用上问题比较多

beego,最早的go web框架之一,工具集比较完善,性能比较差

fiber,发展迅速建立在fasthttp上,性能目前最高,比较简洁上手比较快,类似gin

go的框架可以理解为库,并不是用了某一个框架就不能用别的框架,可以选择性的使用各个库中的优秀组件,进行组合

gin介绍

基于Radix树的理由,小内存占用没有反射。可预测的API性能

支持中间件

传入的http请求可以由一系列中间件和最终操作来处理

gin可以catch一个发生在HTTP请求中的panic并recover

Gin可以解析并验证请求的JSON

更好的组织路由,是否需要授权,不同的API版本….这些组合无线、、无限嵌套不会降低性能。

Gin提供了一种方便的方法来收集HTTP 请求期间发生的所有错误,最终,中间件可以将它们写入日志文件,数据库并通过网络发送

Gin为JSON,XML和HTML渲染提供了易于使用的API

新建一个中间件非常简单

快速入门

 go get -u github.com/gin-gonic/gin

示例程序:

 package main
 ​
 import "github.com/gin-gonic/gin"
 ​
 func main() {
     r := gin.Default()
     r.GET("/ping", func(c *gin.Context) {
         c.JSON(200, gin.H{
             "message": "pong",
         })
     })
     r.Run() // 监听并在 0.0.0.0:8080 上启动服务
 }
 ​

简单的代码就实现了一个http的服务

路由

路由是URI到函数的映射

一个URI包含:

  • 协议http/https

  • ip端口或者域名,比如127.0.0.1:8080或者www.test.com

  • path

  • query

同时访问时还要指明HTTP METHOD

GET

  • 请求一个指定资源的表示形式,使用GET的请求应该只被用于获取数据

POST

  • 将实体提交到指定的资源,通常会导致在服务器上的状态变化

HEAD

  • 请求一个与GET请求的响应相同的响应,但是没有响应体

PUT

  • PUT方法用于请求有效载荷替换目标资源的所有当前表示

DELETE

  • DELETE方法删除指定资源

CONNECT

  • CONNECT方法建立一个到由目标资源标识的服务器的隧道

OPTIONS

  • OPTIONS方法用于描述目标资源的通信选项

TRACE

  • 沿着目标资源的路径执行一个消息环回测试

PATCH

  • 对资源应用部分修改

RESTfulAPI规范

RESTful API规范建议我们使用特定的HTTP方法来对服务器上的资源进行操作

  1. GET,表示读取服务器上的资源

  2. POST,表示在服务器上创建资源

  3. PUT,表示更新或者替换服务器上的资源

  4. DELETE,表示删除服务器上的资源

  5. PATCH,表示更新/修改资源的一部分

请求方法

 r.GET("/get",func(ctx *gin.Context) {
     ctx.JSON(200,"get")
 })
 r.POST("/post",func(ctx *gin.Context) {
     ctx.JSON(200,"POST")
 })
 ​

如果想要支持所有:

 r.Any("/any",func(ctx *gin.Context) {
     ctx.JSON (200,"any")
     })

URI

URI 书写的时候,我们不需要关心scheme和authority两部分,我们主要通过path和query两部分的书写来进行资源的定位

  • 静态uri,比如/hello,/user/find

  •  r.POST("/user/find",func(ctx *gin.Context)) {
     }
  • 路径参数比如/user/find/id

  •  r.POST("/user/find/:id", func(ctx *gin.Context) {
             param := ctx.Param("id")
             ctx.JSON(200, param)
         })
  • 模糊匹配 /user/*path

  •  r.POST("/user/*path", func(ctx *gin.Context) {
             param := ctx.Param("path")
             ctx.JSON(200, param)
     })

处理函数

 type HandlerFunc func(*Context)

通过上下文参数,获取http的请求参数,响应http请求等

分组路由

进行开发的时候,我们要进行模块的划分,或进行多版本开发

 ug := r.Group("/user")
     {
         ug.GET("find", func(ctx *gin.Context) {
             ctx.JSON(200, "user find")
         })
         ug.POST("save", func(ctx *gin.Context) {
             ctx.JSON(200, "user save")
         })
     }
     gg := r.Group("/goods")
     {
         gg.GET("find", func(ctx *gin.Context) {
             ctx.JSON(200, "goods find")
         })
         gg.POST("save", func(ctx *gin.Context) {
             ctx.JSON(200, "goods save")
         })
     }

你可能感兴趣的:(golang)