您的位置 首页 golang

golang web框架 gin基本操作

gin

安装使用

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

// 导入
import "github.com/gin-gonic/gin"
  

路由传参

  • 无参路由
  • API参数
  • URL参数
   package main

  import (
      "fmt"
      "github.com/gin-gonic/gin"
      "net/http"
  )

  func demoGin1(c *gin.Context) {
      c.String(http.StatusOK, "lalala")
  }

  func demoGin2(c *gin.Context) {
      // 通过param参数来获取方法
      Id := c.Param("id")
      c.String(http.StatusOK, fmt.Sprintf("id is %v", Id))
  }

  func demoGin3(c *gin.Context) {
      username := c.DefaultQuery("name", "xxx") //参数不存在,会返回默认值xxx
      username2 := c.Query("name")              // 参数不存在,就返回空字符串
      c.String(http.StatusOK, fmt.Sprintf("default query is:%#v \nquery is: %#v\n", username, username2))
  }

  func main() {
      r := gin.Default()
      r.GET("/lalala", demoGin1)   // 无参数路由 
      r.GET("/test/:id", demoGin2) // api 参数 
      r.GET("/query/", demoGin3)   // url 参数 
      r.Run(":8089")
  }
  

ShouldBind参数绑定

  • 能够基于请求自动提取 JSON form表单 QueryString 类型的数据,并把值绑定到指定的结构体对象。
   package main

  import (
      "fmt"
      "github.com/gin-gonic/gin"
      "net/http"
  )

  type Login struct {
      User     string `form:"user" json:"user" binding:"required"`
      Password string `form:"password" json:"password" binding:"required"`
  }

  func demoLogin(c *gin.Context) {
      var login Login
      //
      if err := c.ShouldBind(&login); err != nil {
          c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
      }
      c.String(http.StatusOK, fmt.Sprintf("姓名:%s -- 密码:%s", login.User, login.Password))
  }

  func main() {
      r := gin.Default()
      r.POST("/login/", demoLogin)
      r.Run(":8089")
  }
  

响应返回

  • 响应String 用 c.String 来返回
  • 响应json 用 c.Json 来返回值,也可以直接用 gin.H
  • 响应Xml 用 c.XML 来返回
  • 响应Yaml 用 c.YAML 来返回
   package main

  import (
      "github.com/gin-gonic/gin"
  )

  // 多种响应方式
  func main() {
      r := gin.Default()

      // 1.json
      r.GET("/someJSON", func(c *gin.Context) {
          c.JSON(200, gin.H{"message": "someJSON", "status": 200})
      })

      // 2. 结构体响应
      r.GET("/someStruct", func(c *gin.Context) {
          var msg struct {
              Name    string
              Message string
              Number  int
          }
          msg.Name = "root"
          msg.Message = "message"
          msg.Number = 123
          c.JSON(200, msg)
      })

      // 3.XML
      r.GET("/someXML", func(c *gin.Context) {
          c.XML(200, gin.H{"message": "abc"})
      })

      // 4.YAML响应
      r.GET("/someYAML", func(c *gin.Context) {
          c.YAML(200, gin.H{"name": "zhangsan"})
      })

      r.Run(":8089")
  }
  

路由重定向

  • c.Redirect 来重定向
   package main

  import (
      "net/http"
      "github.com/gin-gonic/gin"
  )

  func main() {
      r := gin.Default()
      r.GET("/", func(c *gin.Context) {
          c.Redirect(http.StatusMovedPermanently, "www.baidu.com")
      })
      r.Run()
  }
  

路由分发

  • 路由拆分到多个文件
   demoGin3
  ├── go.mod
  ├── go.sum
  ├── main.go
  └── routers
      ├── user.go
      └── books.go
  
   // main.go

  package main

  import (
      "demoGin3/routes"
      "github.com/gin-gonic/gin"
  )

  func main() {
      r := gin.Default()
      routes.LoadBooks(r)
      routes.LoadUsers(r)

      r.Run(":8089")
  }
  
   // routes/books.go
  package routes

  import (
      "github.com/gin-gonic/gin"
      "net/http"
  )

  func LoadBooks(e *gin.Engine) {
      e.GET("/book", GetBookHandler)
  }

  func GetBookHandler(c *gin.Context) {
      c.JSON(http.StatusOK, gin.H{
          "message": "book route",
      })
  }
  
   // routes/user.go
  package routes

  import (
      "github.com/gin-gonic/gin"
      "net/http"
  )

  func LoadUsers(e *gin.Engine) {
      e.GET("/user", UserHandler)
  }

  func UserHandler(c *gin.Context) {
      c.JSON(http.StatusOK, gin.H{
          "message": "user route",
      })
  }
  
  • 路由拆分到app
   gin_demo
  ├── app
  │   ├── app1
  │   │   ├── handler.go
  │   │   └── router.go
  │   └── app2
  │       ├── handler.go
  │       └── router.go
  ├── go.mod
  ├── go.sum
  ├── main.go
  └── routers
      └── routers.go
  
  • routes.go 中用 include 来注册其他app中的路由, Init 来初始化
 type Option func(*gin.Engine)

var options = []Option{}

// 注册app的路由配置
func Include(opts ...Option) {
    options = append(options, opts...)
}

// 初始化
func Init() *gin.Engine {
    r := gin.Default()
    for _, opt := range options {
        opt(r)
    }
    return r
}  
  • main.go 中注册路由,进行初始化
 func main() {
    // 加载多个APP的路由配置
    routers.Include(shop.Routers, blog.Routers)
    // 初始化路由
    r := routers.Init()
    if err := r.Run(); err != nil {
        fmt.Println("startup service failed, err:%v\n", err)
    }
}  

文章来源:智云一二三科技

文章标题:golang web框架 gin基本操作

文章地址:https://www.zhihuclub.com/97055.shtml

关于作者: 智云科技

热门文章

网站地图