前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Go语言(十三)Gin Web框架

Go语言(十三)Gin Web框架

作者头像
alexhuiwang
发布2020-09-24 16:46:38
8120
发布2020-09-24 16:46:38
举报
文章被收录于专栏:运维博客运维博客

Gin Web框架

简介

Gin框架的安装与使用

  • 安装: go get -u github.com/gin-gonic/gin 基本使用
代码语言:javascript
复制
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:9090")
}

支持restful风格的API

  • 把设计的API抽象成一个个资源,用URI来标识
  • 针对每一个资源,使用统一的方法进行操作
  • 统一的方法: GET,POST,PUT,DELETE
代码语言:javascript
复制
import (
   "github.com/gin-gonic/gin"
   "net/http"
)

type Result struct {
   Message string   `json:"message"`
   Code    int      `json:"code"`
}

func handleUserInfo(c *gin.Context) {
   var result Result = Result{
      Message: "hello",
      Code:    0,
   }
   c.JSON(http.StatusOK,result)
}

func main() {
   r := gin.Default()
   r.GET("/user/info", handleUserInfo)
   r.Run("0.0.0.0:9090")
}

queryString设计

代码语言:javascript
复制
import (
   "github.com/gin-gonic/gin"
   "net/http"
)

type Result struct {
   Message string   `json:"message"`
   Code    int      `json:"code"`
}

type UserInfo struct {
   Result
   UserName  string   `json:"username"`
   Passwd string      `json:"passwd"`
}

func handleUserParams(c *gin.Context) {
   //查询类接口
   username := c.Query("username")
   passwd := c.DefaultQuery("passwd","adcdefg")

   var result UserInfo = UserInfo{
      Result{
         Message: "success",
         Code:    200,
      },
      username,
      passwd,
   }
   c.JSON(http.StatusOK,result)
}

func handleUserInfo(c *gin.Context) {
   //路由类接口
   username := c.Param("username")
   passwd := c.Param("passwd")

   var result UserInfo = UserInfo{
      Result{
         Message: "success",
         Code:    200,
      },
      username,
      passwd,
   }
   c.JSON(http.StatusOK,result)
}

func main() {
   r := gin.Default()
   r.GET("/user/info", handleUserParams)
   r.GET("/user/info/:username/:passwd", handleUserInfo)
   r.Run("0.0.0.0:9090")
}

Gin框架参数传递

获取表单参数

代码语言:javascript
复制
import (
   "github.com/gin-gonic/gin"
   "net/http"
)

type Result struct {
   Message string   `json:"message"`
   Code    int      `json:"code"`
}

type UserInfo struct {
   Result
   UserName  string   `json:"username"`
   Passwd string      `json:"passwd"`
}

func handleUserInfo(c *gin.Context) {
   username := c.PostForm("username")
   passwd := c.PostForm("passwd")

   var result UserInfo = UserInfo{
      Result:   Result{
         Message: "success",
         Code: 200,
      },
      UserName: username,
      Passwd:   passwd,
   }
   c.JSON(http.StatusOK,result)
}

func main()  {
   r := gin.Default()
   r.POST("/user/info",handleUserInfo)
   r.Run(":9090")
}

单文件上传

代码语言:javascript
复制
func handleUpload(c *gin.Context) {
   file,err := c.FormFile("testfile")
   if err != nil {
      fmt.Printf("upload file faild,err:%v\n",err)
      return
   }

   //文件上传路径
   filename := fmt.Sprintf("/Users/wanghui/go/src/oldBoy/day8/tmp/%s",file.Filename)
   //文件保存
   err = c.SaveUploadedFile(file,filename)
   if err != nil {
      fmt.Printf("save file faild,err:%v\n",err)
      return
   }
   //状态返回
   c.JSON(http.StatusOK,"file upload success")
}

func main() {
   r := gin.Default()
   r.POST("/file/upload",handleUpload)
   r.Run(":9090")
}

多文件上传

代码语言:javascript
复制
func multiHandleUpload(c *gin.Context) {
   //多文件上传
   form,err := c.MultipartForm()
   if err != nil {
      fmt.Printf("upload file faild,err:%v\n",err)
      return
   }
   files := form.File["testfile"]

   for _,file := range files {
      filename := fmt.Sprintf("/Users/wanghui/go/src/oldBoy/day8/tmp/%s",file.Filename)
      err = c.SaveUploadedFile(file,filename)
      if err != nil {
         fmt.Printf("save file faild,err:%v\n",err)
         return
      }
   }
   //状态返回
   c.JSON(http.StatusOK,"file upload success")
}
func main() {
   r := gin.Default()
   r.POST("/file/upload",handleUpload)
   r.POST("/files",multiHandleUpload)
   r.Run(":9090")
}

通过postman上传文件

Go语言(十三)Gin Web框架
Go语言(十三)Gin Web框架

路由分组

代码语言:javascript
复制
func main()  {
   r := gin.Default()
   v1Group := r.Group("/v1")
   v1Group.POST("/user/info",handleUserInfo)
   v1Group.POST("/user/info2",handleUserInfo)
   r.Run(":9090")
}

gin的参数绑定

  • 为什么要使用参数绑定
    • 通过反射的机制,自动提取querystring、form表单,json,xml等参数到struct中
    • 通过http协议中的content type,识别是json,xml或者表单
代码语言:javascript
复制
type UserInfo struct {
   UserName  string  `form:"username" json:"username" binding:"required"`
   Passwd    string  `form:"passwd" json:"passwd" binding:"required"`
   Age       int    `form:"age" json:"age" binding:"required"`
   Sex       string  `form:"sex" json:"sex" binding:"required"`
}

func PostUserInfo(c *gin.Context) {
   var UserInfo UserInfo
   //表单绑定,使用指针
   err := c.ShouldBind(&UserInfo)
   if err != nil {
      return
   }
   c.JSON(http.StatusOK,UserInfo)
}

func PostUserInfoJson(c *gin.Context) {
   var UserInfo UserInfo
   //表单绑定,使用指针
   err := c.ShouldBindJSON(&UserInfo)
   if err != nil {
      return
   }
   c.JSON(http.StatusOK,UserInfo)
}

func GetUserInfoJson(c *gin.Context) {
   var UserInfo UserInfo
   //表单绑定,使用指针
   err := c.ShouldBindJSON(&UserInfo)
   if err != nil {
      return
   }
   c.JSON(http.StatusOK,UserInfo)
}

func main() {
   r := gin.Default()
   v1Group := r.Group("/v1")
   v1Group.POST("/user/infos",PostUserInfo)
   v1Group.POST("/user/infojson",PostUserInfoJson)
   v1Group.GET("/user/info",GetUserInfoJson)
   r.Run(":9090")
}

渲染

  • gin.Context.JSON方法进行渲染
代码语言:javascript
复制
type UserInfo struct {
   UserName  string  `form:"username" json:"username" binding:"required"`
   Passwd    string  `form:"passwd" json:"passwd" binding:"required"`
}

func GetUserInfoJson(c *gin.Context) {
   var userInfo = &UserInfo{
      UserName: "zhansan",
      Passwd:   "aaaa",
   }
   c.XML(200,userInfo)
}

func main() {
   r := gin.Default()
   v1Group := r.Group("/v1")
   v1Group.GET("/user/info",GetUserInfoJson)
   r.Run(":9090")
}

HTML模板渲染

  • templates/post.html
代码语言:javascript
复制
{{ define "index.tmpl" }}
    <html><h1>
        {{ . }}
    </h1>
    <p>Using posts/index.tmpl</p>
    </html>
{{ end }}
  • server.go
代码语言:javascript
复制
func HandleHtmml(c *gin.Context) {
   c.HTML(200,"index.tmpl","mmmmmmmm")
}

func main() {
   r := gin.Default()
   r.LoadHTMLGlob("./templates/*")
   r.GET("/user/info",HandleHtmml)
   r.Run(":9090")
}

gin中间件

  • gin框架在请求处理过程中,加入用户自己的钩子函数,这个钩子函数就叫做中间件
  • 因此,可以使用中间件处理一些公共业务逻辑,比如耗时统计,日志打印,登录校验等
代码语言:javascript
复制
func StatCost(c *gin.Context) {
   //中间件
   start := time.Now()
   fmt.Printf("start \n")
   c.Next()
   lattacy := time.Since(start)
   fmt.Printf("cost Time is %dms\n", lattacy/1000/1000)
}

func funcHello(c *gin.Context) {
   fmt.Printf("request start\n")
   time.Sleep(time.Second * 3)
   c.JSON(http.StatusOK, "hello world")
}

func main() {
   r := gin.Default()
   r.Use(StatCost)
   r.GET("/hello", funcHello)
   r.Run(":9090")
}

gin框架路由原理

Go语言(十三)Gin Web框架
Go语言(十三)Gin Web框架
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/04/18 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Gin Web框架
    • 简介
      • Gin框架的安装与使用
        • 支持restful风格的API
        • queryString设计
        • Gin框架参数传递
        • 单文件上传
        • 多文件上传
        • 路由分组
        • gin的参数绑定
        • 渲染
        • HTML模板渲染
        • gin中间件
        • gin框架路由原理
    相关产品与服务
    消息队列 TDMQ
    消息队列 TDMQ (Tencent Distributed Message Queue)是腾讯基于 Apache Pulsar 自研的一个云原生消息中间件系列,其中包含兼容Pulsar、RabbitMQ、RocketMQ 等协议的消息队列子产品,得益于其底层计算与存储分离的架构,TDMQ 具备良好的弹性伸缩以及故障恢复能力。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档