当前位置: 首页 > 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)
    

相关文章:

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

云原生学习路线导航页&#xff08;持续更新中&#xff09; 本文是golang语言学习系列&#xff0c;本篇对Gin框架的基本使用方法进行学习 1.Gin框架是什么 Gin 是一个 Go (Golang) 编写的轻量级 http web 框架&#xff0c;运行速度非常快&#xff0c;如果你是性能和高效的追求者…...

春招百题--堆

一、堆的定义 二、堆&#xff08;优先队列&#xff09; 堆通常用于实现优先队列&#xff08;priority_queue&#xff09;&#xff0c;大顶堆相当于元素按从大到小的顺序出队的优先队列。从使用角度来看&#xff0c;我们可以将“优先队列”和“堆”看作等价的数据结构。 堆的…...

全志A40i android7.1 移植wifi驱动的一般流程

一&#xff0c;问题分析 一般情况下移植一款模组&#xff0c;会涉及到驱动&#xff0c;firmware, hal层&#xff0c;方案端的适配。 下面以RTL8723ds为例详细列出移植的通用步骤。 二&#xff0c;移植步骤 1. 移植Wi-Fi驱动 从RTL原厂或者已经支持的其他把内核版本中获取驱动…...

Qt——Qt绘图之QPainter的使用总结(使用paintEvent实现旋转图片效果)

【系列专栏】:博主结合工作实践输出的,解决实际问题的专栏,朋友们看过来! 《项目案例分享》 《极客DIY开源分享》 《嵌入式通用开发实战》 《C++语言开发基础总结》 《从0到1学习嵌入式Linux开发》 《QT开发实战》 《Android开发实战》...

Day83:服务攻防-开发组件安全JacksonFastJson各版本XStreamCVE环境复现

目录 J2EE-组件Jackson-本地demo&CVE 代码执行 (CVE-2020-8840) 代码执行 (CVE-2020-35728&#xff09; J2EE-组件FastJson-本地demo&CVE FastJson < 1.2.24 FastJson < 1.2.47 FastJson < 1.2.80 (利用条件比较苛刻) J2EE-组件XStream-靶场&CVE …...

【QT+QGIS跨平台编译】056:【pdal_kazhdan+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

点击查看专栏目录 文章目录 一、pdal_kazhdan介绍二、pdal下载三、文件分析四、pro文件五、编译实践一、pdal_kazhdan介绍 pdal_kazhdan 是 PDAL(Point Data Abstraction Library)相关的 Kazhdan 算法的实现。PDAL 是一个用于处理和分析点云数据的开源库,而 Kazhdan 算法通常…...

泰坦尼克号幸存者数据分析

泰坦尼克号幸存者数据分析 1、泰坦尼克号数据集2、数据集加载与概览3、泰坦尼克号幸存者数据分析4、哪些人可能成为幸存者&#xff1f; 1、泰坦尼克号数据集 泰坦尼克号的沉没是世界上最严重的海难事故之一&#xff0c;造成了大量的人员伤亡。这是一艘号称当时世界上最大的邮轮…...

Memcached 教程之 PHP 连接 Memcached 服务(十)

PHP 连接 Memcached 服务 在前面章节中我们已经介绍了如何安装 Memcached 服务&#xff0c;接下来我们为大家介绍 PHP 如何使用 Memcached 服务。 PHP Memcache 扩展安装 PHP Memcache 扩展包下载地址&#xff1a;PECL :: Package :: memcache&#xff0c;你可以下载最新稳定…...

【zlm】音视频流与音频流合并的设计

目录 设想一 设想二 方案三 关键技术 测试语句 测试脚本 参考文档 设想一 //开始录制_option.mp4_save_path custom_path;_option.mp4_max_second max_second;vector<Track::Ptr> mytracks getTracks();auto src MediaSource::find( DEFAULT_VHOST, "1&quo…...

typescript的工作流

先coding code.ts代码&#xff0c;由tsc编译code.ts生成code.js格式 npm install —save-dev lite-server 是用来安装轻量级的服务器&#xff0c;只是用来开发的一个服务器&#xff0c;真正到生产环境中时可能会使用类似于Apache的server或者汤姆猫一类的服务器&#xff0c;安…...

MATLAB下载与安装详细教程:从官方获取到成功启动

引言 MATLAB&#xff08;MATrix LABoratory&#xff09;作为一款全球知名的高级数值计算与数据分析平台&#xff0c;以其强大的矩阵运算能力、丰富的内置函数库以及直观易用的图形用户界面&#xff0c;深受科研人员、工程师和学生群体的青睐。无论是进行复杂的数学建模、信号处…...

【随笔】Git 高级篇 -- 分离 HEAD(十一)

&#x1f48c; 所属专栏&#xff1a;【Git】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f496; 欢迎大…...

mac、windows 电脑安装使用多个版本的node

我们为啥要安装多个不同版本的node&#xff1f; 开发旧项目时&#xff0c;使用低版本Nodejs。开发新项目时&#xff0c;需使用高版本Node.js。可使用n同时安装多个版本Node.js&#xff0c;并切换到指定版本Node.js。 mac电脑安装 一、全局安装 npm install -g n 二、mac电脑…...

vue 浅解watch cli computed props ref vue slot axios nexttick devtools说明使用

Vue.js 是一个强大的前端框架&#xff0c;它提供了很多有用的功能和工具。你提到的这些特性&#xff08;watch、cli、computed、props、ref、slot、axios、nextTick、devtools&#xff09;在 Vue 中各自扮演着不同的角色。下面我会逐一解释这些特性如何在 Vue 中使用&#xff1…...

Unity自定义框架(1)-----------单例模式

前言&#xff1a; Unity作为一款强大的游戏开发引擎&#xff0c;其基础框架的设计对于项目的结构和性能有着重要的影响。其中&#xff0c;单例模式是一种常用的设计模式&#xff0c;用于确保一个类只有一个实例&#xff0c;并提供一个全局访问点。 什么是单例模式&#xff1f…...

04-自媒体文章-自动审核

自媒体文章-自动审核 1)自媒体文章自动审核流程 1 自媒体端发布文章后&#xff0c;开始审核文章 2 审核的主要是审核文章的内容&#xff08;文本内容和图片&#xff09; 3 借助第三方提供的接口审核文本 4 借助第三方提供的接口审核图片&#xff0c;由于图片存储到minIO中&…...

LeetCode-热题100:763. 划分字母区间

题目描述 给你一个字符串 s 。我们要把这个字符串划分为尽可能多的片段&#xff0c;同一字母最多出现在一个片段中。 注意&#xff0c;划分结果需要满足&#xff1a;将所有划分结果按顺序连接&#xff0c;得到的字符串仍然是 s 。 返回一个表示每个字符串片段的长度的列表。…...

IDEA2023创建SpringMVC项目

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; 开发环境篇 ✨特色专栏&#xff1a; M…...

ubuntu-server部署hive-part2-安装hadoop

参照 https://blog.csdn.net/qq_41946216/article/details/134345137 操作系统版本&#xff1a;ubuntu-server-22.04.3 虚拟机&#xff1a;virtualbox7.0 安装hadoop ​​​​​​下载上传 下载地址 https://archive.apache.org/dist/hadoop/common/hadoop-3.3.4/ 以root用…...

Python深度学习032:conda操作虚拟环境env的全部命令

文章目录 创建和管理环境环境列表和检查环境的保存与复制更新环境清理 CondaConda 是一个开源的包管理器和环境管理器,可以用于安装、运行和升级包和环境。 使用 Conda,你可以创建、导出、列出、删除和更新环境,这些环境可以包含不同版本的 Python 以及/或软件包。 下面列出…...

手把手教你读懂SAP SD定价中的红绿灯图标(KINAK字段全解析)

SAP SD定价红绿灯图标全解析&#xff1a;从业务逻辑到实战诊断 在SAP SD模块的日常操作中&#xff0c;定价条件的有效性判断直接影响着销售订单的准确性和业务决策效率。那些看似简单的红绿灯图标背后&#xff0c;隐藏着复杂的业务规则和系统逻辑。本文将带您深入理解KINAK字段…...

终极RPG Maker解密工具:3分钟学会提取游戏资源

终极RPG Maker解密工具&#xff1a;3分钟学会提取游戏资源 【免费下载链接】RPGMakerDecrypter Tool for extracting RPG Maker XP, VX and VX Ace encrypted archives. 项目地址: https://gitcode.com/gh_mirrors/rp/RPGMakerDecrypter 还在为RPG Maker加密文件无法提取…...

Qwen3-4B写作大师实战:辅助程序员编写项目文档与技术方案

Qwen3-4B写作大师实战&#xff1a;辅助程序员编写项目文档与技术方案 1. 程序员文档写作的痛点与挑战 程序员在日常工作中需要编写大量技术文档&#xff0c;包括项目说明、API文档、技术方案、开发日志等。然而&#xff0c;许多开发者面临共同的写作难题&#xff1a; 技术思维与…...

PSIM仿真:基于三相桥式逆变器的下垂控制与LC滤波、SPWM调制

&#xff08;PSIM&#xff09;下垂控制-基于三相桥式逆变器的下垂控制&#xff0c;电压电流双闭环&#xff0c;采用LC滤波&#xff0c;SPWM调制方式 1.提供PSIM仿真源文件 2.提供下垂控制原理与下垂系数计算方法 3.中点平衡控制&#xff0c;电压电流双闭环控制 提供参考文献下垂…...

付费墙绕过工具深度解析:技术原理与合规使用指南

付费墙绕过工具深度解析&#xff1a;技术原理与合规使用指南 【免费下载链接】bypass-paywalls-chrome-clean 项目地址: https://gitcode.com/GitHub_Trending/by/bypass-paywalls-chrome-clean 在数字内容付费模式日益普及的今天&#xff0c;如何在尊重知识产权的前提…...

告别眼部疲劳?Zotero Night护眼工具让文献阅读轻松升级

告别眼部疲劳&#xff1f;Zotero Night护眼工具让文献阅读轻松升级 【免费下载链接】zotero-night Night theme for Zotero UI and PDF 项目地址: https://gitcode.com/gh_mirrors/zo/zotero-night 作为学术研究的得力助手&#xff0c;Zotero帮助无数用户管理海量文献。…...

Llama-3.2V-11B-cot实战案例:金融财报图表理解与关键结论提取

Llama-3.2V-11B-cot实战案例&#xff1a;金融财报图表理解与关键结论提取 1. 项目概述 Llama-3.2V-11B-cot 是一款结合视觉理解和逻辑推理能力的先进模型&#xff0c;特别适合处理需要综合分析图像和文本信息的任务。在金融领域&#xff0c;它能够自动解读财报中的各类图表&a…...

Android开发避坑指南:RecyclerView最后一行被截断的5种原因及对应解决方案

Android开发避坑指南&#xff1a;RecyclerView最后一行被截断的5种原因及对应解决方案 在Android应用开发中&#xff0c;RecyclerView作为列表展示的核心组件&#xff0c;其灵活性和高性能深受开发者喜爱。然而&#xff0c;在实际项目中&#xff0c;我们经常会遇到一个令人头疼…...

QMCDecode:免费解锁QQ音乐加密文件的终极解决方案

QMCDecode&#xff1a;免费解锁QQ音乐加密文件的终极解决方案 【免费下载链接】QMCDecode QQ音乐QMC格式转换为普通格式(qmcflac转flac&#xff0c;qmc0,qmc3转mp3, mflac,mflac0等转flac)&#xff0c;仅支持macOS&#xff0c;可自动识别到QQ音乐下载目录&#xff0c;默认转换结…...

XUnity.AutoTranslator:Unity游戏自动翻译解决方案

XUnity.AutoTranslator&#xff1a;Unity游戏自动翻译解决方案 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator XUnity.AutoTranslator是一款专业的Unity游戏自动翻译插件&#xff0c;能够实时将游戏文本转…...