当前位置: 首页 > news >正文

golang语言系列:Web框架+路由 之 Gin

云原生学习路线导航页(持续更新中)

本文是golang语言学习系列,本篇对Gin框架的基本使用方法进行学习

1.Gin框架是什么

  • Gin 是一个 Go (Golang) 编写的轻量级 http web 框架,运行速度非常快,如果你是性能和高效的追求者
  • Gin 最擅长的就是 Api 接口的高并发,如果项目的规模不大,业务相对简单,这个时候我们也推荐您使用 Gin
  • Gin 的官网:https://gin-gonic.com/zh-cn/
  • Gin 官方文档地址:https://gin-gonic.com/zh-cn/docs/
    • 有中文文档,可以直接看文档学习
  • Github 地址:https://github.com/gin-gonic/gin

2.Gin框架快速入门

2.1.快速入门

  • 有一篇博客写的非常详细,直接看这个入门就行
    • Golang gin框架
  • 按照上面博客学习过程中,可能遇到的疑问,写在 2.2 中

2.2.学习上面博客可能遇到的问题

2.2.1.Json和JsonP的区别

  • JSON(JavaScript Object Notation)和JSONP(JSON with Padding)是两种用于在网络上传输数据的格式,二者区别如下。
  • JSON(JavaScript Object Notation)
    • JSON 是一种数据格式,用于在不同的系统之间传输数据。
    • JSON 是纯文本,易于阅读和编写,也易于解析和生成。
    • JSON 数据可以表示为对象、数组、字符串、数字、布尔值和 null。
    • JSON 数据格式不支持跨域请求。
  • JSONP(JSON with Padding)
    • JSONP 是 JSON 的一种“使用模式”,用于解决跨域请求的问题。
    • JSONP 实际上是在 JSON 数据周围包裹了一个函数调用,这个函数名由客户端指定。
      • JSONP的请求,客户端需要在url后使用 ? 指定一个 callback 查询参数
      • 因此,在上面的博客中,jsonp请求的响应,会被客户端传入的callback包裹起来,形成callback调用
    • JSONP 的工作原理是通过动态创建 <script> 标签,将请求发送到另一个域上的 JSONP 服务端点,并且该服务端点返回的数据已经包含在了指定的函数调用中。
    • JSONP 允许在不同域之间进行数据交换,绕过了浏览器的同源策略限制。
  • 总结
    • JSON 是一种数据格式,而 JSONP 则是使用 JSON 数据进行跨域请求的一种技术
    • JSONP 通常用于处理由浏览器的同源策略引起的限制,允许在不同域之间进行数据交换

2.2.2.HTML模板渲染讲的不清楚

  • html渲染,上面博客说的不清楚,建议看官方文档:
    • https://gin-gonic.com/zh-cn/docs/examples/html-rendering/

2.2.3.请求参数绑定结构体重点

  • 标记的使用

    • url后使用?传递的查询参数请求体为"user=123&password=456"这种格式的body,需要结构体设置 form 才可以使用 gin 的自动绑定
      type Userinfo struct {Username string `form:"user"`Password string `form:"password"`
      }
      
    • 不过现在的post请求,请求体为 “application/json”,结构体设置json标记可选
      // 设置json,需要按照json标记来,可以绑定 {"user": "123", "pwd": "456"}
      type Userinfo struct {Username string `json:"user"`Password string `json:"pwd"`
      }// 没有设置json,则请求体需要和属性名一致,可以绑定 {"username": "123", "password": "456"}
      type Userinfo struct {Username string `form:"user"`Password string `form:"pwd"`
      }
      
    • 路径参数,需要使用uri参数
      // 接口可以是 */:user/:pwd
      type Userinfo struct {Username string `uri:"user"`Password string `uri:"pwd"`
      }
      
    • Header 头信息绑定,需要使用header参数
  • gin.Context 的绑定方法使用

    • 我们用的最多的绑定方法是 c.ShouldBind(),可以根据req的Context-Type自动推断要绑定的类型
    • 不过 gin.Context 为 很多类型编写了绑定方法,如果你明确知道前端穿过来的数据是什么格式,可以直接使用这些方法
      在这里插入图片描述
    • 可以看到,gin.Context有两个系列方法,Bindxxx和ShouldBindxxx方法,二者区别如下
      • Bind 系列方法:
        • Bind系列方法在绑定失败时会直接将错误信息发送给客户端,并终止请求处理。
        • 这意味着如果绑定失败,客户端将收到一个包含错误信息的响应,并且请求处理将不会继续进行。
      • ShouldBind 系列方法:
        • ShouldBind系列方法在绑定失败时不会立即将错误信息发送给客户端,而是将错误信息存储在上下文中。
        • 这使得开发者可以根据实际情况自定义错误处理逻辑,例如返回特定的错误响应、记录错误日志等。
        • 开发者可以通过检查上下文中的错误信息来判断绑定是否成功,并根据需要采取进一步的行动。
  • 更详细的用法,可以学习:

    • Gin 框架学习笔记(02)— 参数自动绑定到结构体
    • Go学习第十五章——Gin参数绑定bind与验证器

2.2.4.gin.Context.Abort()方法

  • gin路由注册时,参数可以填多个中间件+一个处理函数
    • 其中参数位置,gin的中间件,必须放在 处理函数 前面
    • gin的中间件,使用 c.Next 控制是请求到达时执行,还是请求返回时执行
  • c.Abort 执行后
    • 当前中间件的后续语句,还会执行
    • 但是 c.Next 失效了,后面的中间件和最后的处理函数,都不会再执行
    • 执行完当前中间件,请求就返回了
    • 如下面代码,程序会输出 1111111111handle time,但是不会输出 2222222222
    func CalTimeMiddleWare(c *gin.Context) {start := time.Now()c.Abort()log.Info("1111111111")c.Next()log.Infof("handle time is [%d]", time.Since(start).Nanoseconds())
    }func MiddleWare2(c *gin.Context) {log.Info("2222222222")
    }adminRouter.GET("/users", middleware.CalTimeMiddleWare, middleware.MiddleWare2, controller.NewAdminController().List)
    

2.2.5.使用gin进行文件上传

  • 上面的博客里,没有写gin上传文件的内容
  • 可以直接看 官方文档的内容,写的很详细
  • 上传单文件:
    • https://gin-gonic.com/zh-cn/docs/examples/upload-file/single-file/
  • 上传多文件:
    • https://gin-gonic.com/zh-cn/docs/examples/upload-file/multiple-file/

2.2.6.gin获取cookie

  • gin.Context.Cookie(“key1”)方法,获取cookie中键为key1的值
  • 比如下面,c.Cookie(“key1”) 得到的值就是 value1
    curl --location 'http://localhost:8080/admin/users' \
    --header 'Cookie: key1=value1; key2=value2'
    
  • go代码写法
    v, err := c.Cookie("key1")
    if err != nil {log.Warnf("don't find cookie in [%s]", c.Request.URL.Path)
    }
    c.Set("key1", v)
    

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • ChatGPT 之优势与缺陷
  • vue3和vue2 之 provide/inject 用法区别 ---vue3组件间通讯2
  • gpt的构造和原理
  • CentOS安装MySQL数据库
  • java操作mongodb详解
  • 汽车CAN网络中的checksum和Rollingcounter的作用?
  • FSQ8罗德与施瓦茨FSQ8信号分析仪
  • 第六题:标题统计
  • 第九届蓝桥杯大赛个人赛省赛(软件类)真题C 语言 A 组-航班时间
  • Transformer重磅更新!新SOTA提速50%,更节省计算资源
  • 无人售货奶柜:开启便捷生活的新篇章
  • 记一次Cannot deploy POJO class [xxx$$EnhancerBySpringCGLIB$$xxx]的错误
  • 秒杀活动库存扣减逻辑详解:从批量到单个,再到缓存与日志记录
  • redis链表结构和简单动态字符串(SDS)
  • Docker之镜像与容器的相关操作
  • ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  • bearychat的java client
  • Flex布局到底解决了什么问题
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • JavaScript中的对象个人分享
  • Laravel 中的一个后期静态绑定
  • mysql常用命令汇总
  • MySQL主从复制读写分离及奇怪的问题
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • python大佬养成计划----difflib模块
  • React的组件模式
  • supervisor 永不挂掉的进程 安装以及使用
  • Work@Alibaba 阿里巴巴的企业应用构建之路
  • 初探 Vue 生命周期和钩子函数
  • 订阅Forge Viewer所有的事件
  • 分布式熔断降级平台aegis
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 复杂数据处理
  • 坑!为什么View.startAnimation不起作用?
  • 前端性能优化——回流与重绘
  • 前端之React实战:创建跨平台的项目架构
  • 让你成为前端,后端或全栈开发程序员的进阶指南,一门学到老的技术
  • 扫描识别控件Dynamic Web TWAIN v12.2发布,改进SSL证书
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • 提醒我喝水chrome插件开发指南
  • 微信公众号开发小记——5.python微信红包
  • 一天一个设计模式之JS实现——适配器模式
  • 找一份好的前端工作,起点很重要
  • 带你开发类似Pokemon Go的AR游戏
  • 新年再起“裁员潮”,“钢铁侠”马斯克要一举裁掉SpaceX 600余名员工 ...
  • 组复制官方翻译九、Group Replication Technical Details
  • #我与Java虚拟机的故事#连载03:面试过的百度,滴滴,快手都问了这些问题
  • (+3)1.3敏捷宣言与敏捷过程的特点
  • (24)(24.1) FPV和仿真的机载OSD(三)
  • (42)STM32——LCD显示屏实验笔记
  • (三)Kafka离线安装 - ZooKeeper开机自启
  • (转)shell中括号的特殊用法 linux if多条件判断
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • (转)甲方乙方——赵民谈找工作
  • (转)为C# Windows服务添加安装程序