GIN 入门手册

GIN 入门手册

简介

Gin 是一个用 Go (Golang) 编写的 Web 框架, 相当于Python的Flask.

使用包 : import "github.com/gin-gonic/gin"
详细文档: Gin官方文档

如果你想了解更多关于后端的知识, 可以来逛逛我的技术博客: https://dingyuqi.com

常用的结构和代码

在这里我们先列出几个最简单的例子供大家参考.

最简单的Demo

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 上启动服务
}

Group路由组

类似于Flask中的blueprint, 用于组织路由地址的层次.

func main() {
  router := gin.Default()

  // 简单的路由组: v1
  v1 := router.Group("/v1")
  {
        v1.GET("/login", loginHandler()) //url: http://0.0.0.0:8080/v1/login
        v1.GET("/setting", settingHandler()) //url: http://0.0.0.0:8080/v1/setting
  }

  router.Run(":8080")
}

//定义中间件
func loginHandler() gin.HandlerFunc {
  return func(c *gin.Context) {
    c.JSON(200, gin.H{
      "message": "successfully login!!",
    })
  }
}
func settingHandler() gin.HandlerFunc {
  return func(c *gin.Context) {
    c.JSON(200, gin.H{
      "message": "successfully setting!!",
    })
  }
}

中间件

中间件是Gin中非常非常重要的一个部分, 其作用为:

  1. Web请求到到达我们定义的HTTP请求处理方法之前, 拦截请求并进行相应处理(比如: 权限验证, 数据过滤等), 这个可以类比为前置拦截器或前置过滤器,
  2. 在我们处理完成请求并响应客户端时, 拦截响应并进行相应的处理(比如: 添加统一响应部头或数据格式等), 这可以类型为后置拦截器或后置过滤器.

中间件实际上就是一个以gin.Context为形参的函数

Gin中有许多内置的中间件:

func BasicAuth(accounts Accounts) HandlerFunc
func BasicAuthForRealm(accounts Accounts, realm string) HandlerFunc
func Bind(val interface{}) HandlerFunc
func ErrorLogger() HandlerFunc
func ErrorLoggerT(typ ErrorType) HandlerFunc
func Logger() HandlerFunc
func LoggerWithConfig(conf LoggerConfig) HandlerFunc
func LoggerWithFormatter(f LogFormatter) HandlerFunc
func LoggerWithWriter(out io.Writer, notlogged ...string) HandlerFunc
func Recovery() HandlerFunc
func RecoveryWithWriter(out io.Writer) HandlerFunc
func WrapF(f http.HandlerFunc) HandlerFunc
func WrapH(h http.Handler) HandlerFunc

使用示例:

func main() {
  r := gin.Default()

  r.Use(gin.BasicAuth(gin.Accounts{
    "admin": "123456",
  }))

  r.GET("/", func(c *gin.Context) {
    c.JSON(200, "通过验证, 欢迎进入首页")
  })

  r.Run(":8080")
}
中间件的自定义
func MyMiddleware(){
    return func(c *gin.Context){
        //do something
    }
}

//使用时
//Default意味着全局中间件
router = gin.Default() 
router.Use(MyMiddleware()) //注意MyMiddleware有括号

//Group意味着分组使用
adminGroup := r.Group("/admin")
adminGroup.Use(gin.BasicAuth(gin.Accounts{
    "admin": "123456"
}))
adminGroup.GET("/index", func(c *gin.Context) {
    c.JSON(200, "后台首页")
})
数据传递

当我们在中间件拦截并预先处理好数据之后, 要如何将数据传递我们定义的处理请求的HTTP方法呢?可以使用gin.Context中的Set()方法, 其定义如下, Set()通过一个key来存储作何类型的数据, 方便下一层处理方法获取.

func MyMiddleware(c *gin.Context){
    c.Set("mykey",10)
}

router := gin.New()
router.GET("test",MyMiddleware,func(c *gin.Context){
c.GetInt("mykey")
})

对应的方法有:

func (c *Context) GetBool(key string) (b bool)
func (c *Context) GetDuration(key string) (d time.Duration)
func (c *Context) GetFloat64(key string) (f64 float64)
func (c *Context) GetInt(key string) (i int)
func (c *Context) GetInt64(key string) (i64 int64)
func (c *Context) GetString(key string) (s string)
func (c *Context) GetStringMap(key string) (sm map[string]interface{})
func (c *Context) GetStringMapString(key string) (sms map[string]string)
func (c *Context) GetStringMapStringSlice(key string) (smss map[string][]string)
func (c *Context) GetStringSlice(key string) (ss []string)
func (c *Context) GetTime(key string) (t time.Time)
拦截请求与后置拦截
1. 拦截请求

比如我们有些请求需要用户登录或者需要特定权限才能访问, 这时候便可以中间件中做过滤拦截, 当用户请求不合法时, 可以使用下面列出的gin.Context的几个方法中断用户请求:

下面三个方法中断请求后, 直接返回200, 但响应的body中不会有数据.

func (c *Context) Abort()
func (c *Context) AbortWithError(code int, err error) *Error
func (c *Context) AbortWithStatus(code int)

使用AbortWithStatusJSON()方法, 中断用户请求后, 则可以返回json格式的数据.

func (c *Context) AbortWithStatusJSON(code int, jsonObj interface{})
2. 后置拦截

前面我们讲的都是到达我们定义的HTTP处理方法前进行拦截, 其实, 如果在中间件中调用gin.ContextNext()方法, 则可以请求到达并完成业务处理后, 再经过中间件后置拦截处理.

在中间件调用Next()方法, Next()方法之前的代码会在到达请求方法前执行, Next()方法之后的代码则在请求方法处理后执行.

示例:

func MyMiddleware(c *gin.Context){
    c.Set("key",1000)
  c.Next()
  c.JSON(http.StatusOK,c.GetInt("key"))
}
router := gin.New()
router.GET("/test", MyMiddleware, func(c *gin.Context) {
  k := c.GetInt("key")
  c.Set("key", k+2000)
})
router.Run()

运行结果返回值为3000

参考资料

  1. 什么是中间件?
  2. 中间件实战讲解

同步响应和异步响应

每次request请求Gin会开启新的goroutine来处理请求. Gin同时支持请求的同步响应和异步响应. 示例如下:

func main() {
  // 1.创建路由
  // 默认使用了2个中间件Logger(), Recovery()
  r := gin.Default()
  // 1.异步
  r.GET("/long_async", func(c *gin.Context) {
    // 必须搞一个副本不能直接传递
    copyContext := c.Copy()
    c.JSON(http.StatusOK, "异步调用返回")
    // 异步处理
    go func() {
      log.Println("开始异步执行: " + copyContext.Request.URL.Path)
      time.Sleep(8 * time.Second)
      log.Println("结束异步执行: " + copyContext.Request.URL.Path)
    }()
  })
  
    // 2.同步
  r.GET("/long_sync", func(c *gin.Context) {
        log.Println("开始同步执行: " + c.Request.URL.Path)
    time.Sleep(5 * time.Second)
    log.Println("开始同步执行: " + c.Request.URL.Path)
    c.JSON(http.StatusOK, "同步调用返回")
  })
  r.Run(":8080")

}

关于父子goroutine 之间的关系可参考: 主goroutine结束, 子goroutine也立即结束? 和 Goroutine理解 两篇Blog

Docker打包部署

可参考

  1. golang gin 服务器部署
  2. 部署go项目到k8s集群
  3. golang gin 项目部署 docker镜像制作 看这一篇就够了 项目部署一条龙

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/770828.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CPU/内存/综合性能评估工具汇总-3:unixbench

目录 一、概括二、UnixBench 一、概括 嵌入式开发中对要设计的产品、立项的项目进行设计时,往往需要对关键芯片进行性能评估,本文主要总结基于linux系统的产品在性能评估时的工具使用总结,在aarch64(arm64平台下测试),板卡根文件…

前端学习(三)CSS介绍及选择符

##最近在忙期末考试,因此前端笔记的梳理并未及时更新。在学习语言过程中,笔记的梳理对于知识的加深very vital.因此坚持在明天学习新知识前将笔记梳理完整。 主要内容:CSS介绍及选择符 最后更新时间:2024/7/4 目录 内容&#x…

Redis 7.x 系列【15】持久化机制之 RDB

有道无术,术尚可求,有术无道,止于术。 本系列Redis 版本 7.2.5 源码地址:https://gitee.com/pearl-organization/study-redis-demo 文章目录 1. 概述2 执行原理3. 配置项3.1 save3.2 stop-writes-on-bgsave-error3.3 rdbcompress…

HMI 的 UI 风格创造奇迹

HMI 的 UI 风格创造奇迹

关于巴图自动化Profinet协议转Modbus协议网关模块怎么配置IP地址教学

Profinet协议和Modbus协议是工业领域中常用的两种通讯协议,除此以外还有较为常见的:ModbusTCP协议,Profibus协议,Profibus DP协议,EtherCAT协议,EtherNET协议,CAN,CANOPEN等它们在自…

利用运放设计简单有源滤波器(低通、高通、带通)

本文旨在帮助刚接触模电的同学快速设计一个实用可靠的有源滤波器,故我将不会说一些晦涩难懂的原理,只给出仿真电路图。 低通滤波器 图1 低通滤波器 图1所示的是一个截止频率约为1KHz的低通滤波器。 图2 200Hz的情况 图3 2KHz的情况 设计步骤为&#x…

Lesson 47 A cup of coffee

Lesson 47 A cup of coffee 词汇 like v. 喜欢,想要 用法:like 物品 / 人 喜欢……    like 动词ing 喜欢做……(习惯性)    like to 动词原形 喜欢做……(一次性) 例句:我喜欢小狗…

一、强化学习基本概念

一、强化学习基本概念 1.1 何为强化学习?1.2 强化学习的环境1.3 强化学习的目标1.4 强化学习的数据 1.1 何为强化学习? 强化学习(Reinforcement Learning, RL)是机器通过与环境交互来实现目标的一种计算方法。机器和环境的一轮交互是指:机器在…

FlinkCDC-3.1.1 DataStream Source

问题&#xff1a; Caused by: java.lang.ClassNotFoundException: org.apache.flink.table.catalog.ObjectPath 解决&#xff1a; 在poml文件中&#xff0c;导入的flink-table依赖把“ <scope>”去掉 <properties><maven.compiler.source>8</maven.compi…

安卓稳定性之crash详解

目录 前言一、Crash 的基本原理二、Crash 分析思路三、实例分析四、预防措施五、参考链接 前言 在开发和测试 Android 应用程序时&#xff0c;遇到应用程序崩溃是很常见的情况。 Android 崩溃指的是应用程序因为异常或错误而无法正常执行&#xff0c;并且导致应用强制关闭。 一…

通过一个单相逆变器仿真深度学习PR控制器

目录 前言 ​编辑 PR控制器的理论 PR控制器不同表达式及其建模 PR控制器连续积分组合及模型 PR控制器连续传递函数及模型 PR控制器离散积分及模型 PR控制器离散传递函数及模型 PR控制器差分方程及模型 系统仿真效果 总结 前言 在项目开发中常用PI控制器&#xff0c;这次在…

java实现【 生成小程序二维码:图片+二维码备注】

1.逻辑&#xff1a;进行获取小程序的token进行-获取不限制的小程序码。2.参考的地址&#xff1a;微信官方文档&#xff1a;官网-获取不限制的小程序码 需要注意的点&#xff1a;1. 如果传入page这个参数的话必须定义check_path参数&#xff0c;不然无法识别-page指定的目录2. …

2024微信小程序期末大作业-点奶茶微信小程序(后端nodejs-server)(附下载链接)_微信小程序期末大作业百度网盘下载

菜单展示 购物车展示&#xff1a; 提交订单&#xff1a; 支付详情页展示&#xff1a; 订单查看&#xff1a; 查看历史消费&#xff1a; 部分代码展示&#xff1a; <!--pages/home/home.wxml--> <block wx:for"{{listData}}" wx:key"itemlist&qu…

国标GB28181视频汇聚平台LntonCVS视频监控安防平台与国标协议对接解决方案

应急管理部门以“以信息化推动应急管理能力现代化”为总体目标&#xff0c;加快现代信息技术与应急管理业务深度融合&#xff0c;全面支持现代应急管理体系建设&#xff0c;这不仅是国家加强和改进应急管理工作的关键举措&#xff0c;也是应对日益严峻的应急管理形势和满足公众…

数据列表组件-报表

当数据在后端接口查询到&#xff0c;需要在页面展示出来&#xff0c;如果项目有很多report &#xff0c;可以把列表做一个组件 效果如下&#xff1a; js代码&#xff1a; <!DOCTYPE html> <html> <head><meta charset"utf-8" /><title&g…

PKUMOD同学又双叒获奖啦~

近期王选所数据管理研究室的同学们 凭借在各自领域的卓越表现 获得了多项荣誉和奖励 让我们共赏风采~ 期待他们在未来的科研道路上 取得更加辉煌的成就 庞悦 前沿交叉学科研究院2020级博士生 荣获2024年北京大学校长奖学金 庞悦&#xff0c;北京大学元培学院2016级本科生&…

zabbix小白入门:从SNMP配置到图形展示——以IBM服务器为例

作者 乐维社区&#xff08;forum.lwops.cn&#xff09;许远 在运维实践中&#xff0c;Zabbix作为一款强大的开源监控工具&#xff0c;被广泛应用于服务器、网络设备和应用程序的监控&#xff0c;成为保障业务连续性和高效运行的关键。然而&#xff0c;对于Zabbix的初学者来说&a…

2024年前端面试题及答案

7、 nginx代理跨域 8、 nodejs中间件代理跨域 9、 WebSocket协议跨域 前端数据加密问题 1 一般如何处理用户敏感信息&#xff1f; 前端一般使用md5、base64加密、sha1加密&#xff0c;想要了解详情请自行百度。 前端http相关问题 1 HTTP常用状态码及其含义&#xff1f; …

vue-element-admin集成方案如何运行以及代码解读

文章目录 1.vue-admin-admin介绍2.运行方法3.代码解读3.1基础外层文件解读&#xff0c;以及eslint关闭&#xff08;如下图&#xff09;3.2内层src文件分析3.2.1 login流程解析 1.vue-admin-admin介绍 1.1 是一个后台前端解决方案(vueelementui)&#xff0c;内置i18国际化解决方…

行业洞察 | 2024应用程序安全领域现状报告

在信息爆炸的时代&#xff0c;我们每天都在使用各种应用&#xff0c;从社交娱乐到工作学习&#xff0c;应用已经成为我们生活中不可或缺的一部分。然而&#xff0c;你是否知道&#xff0c;在这些便捷的背后&#xff0c;隐藏着巨大的安全风险&#xff1f; 近年来&#xff0c;应用…