【Go】Go Gin框架初识(一)

1. 什么是Gin框架

Gin框架:是一个由 Golang 语言开发的 web 框架,能够极大提高开发 web 应用的效率!

1.1 什么是web框架

web框架体系图(前后端不分离)如下图所示:

画板

从上图中我们可以发现一个Web框架最重要的一些组成部分:

  • HTTP解析/封装系统:解析HTTP请求以及将响应构造为HTTP请求等任务交由web框架来完成
  • 路由系统:将一个请求路由给某一个指定的处理器函数
  • 逻辑处理系统:是后端人员需要关注的重点区域,编写具体业务逻辑以及链接数据库
  • 模板引擎(前后端不分离):将数据嵌入到HTML模板中,构建动态页面

简单来说,web框架将一些繁琐且与业务逻辑无关的部分封装起来供开发者使用,这样开发人员只需要关注业务逻辑层的实现

1.2 web框架两种架构模式

常见的 web 架构模式有两种:

  1. 前后端不分离
  2. 前后端分离

上面已经介绍了前后端不分离的架构体系图,下图是前后端分离的架构图:

画板

可以看出主要区别在于后端没有了模板引擎,意味着HTML页面、图片等static静态资源全部都在前端服务器部署(如nginx),后端服务器只负责编写接口进行业务逻辑处理,然后将前端所需的数据暴露成接口返回!(不和页面打任何交道)

2. Gin框架

2.1 Gin框架如何安装

在Go 1.11之后引入了包管理机制,我们就可以使用go mod tidy一键将代码中所需导入的包从远程服务器下载到本地

package mainimport "github.com/gin-gonic/gin"func main() {// 获取引擎对象r := gin.Default()// 设置路由r.GET("/hello", func(c *gin.Context) {c.String(200, "Hello Gin")})// 启动r.Run(":8080")
}

编写完上述代码以后在控制台输入以下命令:

  1. go mod init gin_first:包管理初始化
  2. go mod tidy:下载所需依赖

看到上述信息就表明 gin 框架已经引入完毕!可以正式编写代码啦~

2.2 Gin框架的路由系统

2.2.1 基本使用

其实在 2.1 节我们已经初步使用过路由系统了

// 设置路由
r.GET("/hello", func(c *gin.Context) {c.String(200, "hello gin")
})

基本语法:r.操作方法(url, 处理器函数)

  • 操作方法:引擎对象基本支持所有的HTTP请求方法,比如GET、POST、PUT、PATCH、DELETE、HEAD、OPTIONS,以及Any(任何请求)、NoRoute(没有请求对应上时访问)
  • url:表示请求对应的路径
  • 处理器函数:表示请求路径为"/hello"时映射到该处理器函数进行执行

现在我们通过浏览器使用GET请求访问路径:http://localhost:8080/hello

2.2.2 路由分组

有时候我们希望对一个 url 路径做更统一化的管理,比如"/user/login"和"/user/register"实际上都是在"/user"路径下的子路由,这个时候就需要引入 路由分组

基本语法:子路由对象 := r.Group(根路由)

package mainimport "github.com/gin-gonic/gin"func main() {// 获取引擎对象r := gin.Default()// 设置根路由userRouter := r.Group("/user"){userRouter.GET("/login", func(ctx *gin.Context) {ctx.String(200, "/user/login")})userRouter.GET("/register", func(ctx *gin.Context) {ctx.String(200, "/user/register")})}// 启动r.Run(":8080")
}

2.3 Gin框架获取参数

2.3.1 获取基本信息
2.3.1.1 获取请求方法

比如在Any请求内部想要知道具体请求方法可以使用:

基本语法:var method string = ctx.Request.Method

package mainimport ("fmt""github.com/gin-gonic/gin"
)func handleFunc(ctx *gin.Context) {// 获取请求方法method := ctx.Request.Methodfmt.Println("请求方法是:" + method)ctx.String(200, "request ok")
}func main() {// 获取引擎对象r := gin.Default()// 设置路由r.Any("/method", handleFunc)// 启动r.Run(":8080")
}

代码运行结果:

2.3.1.2 获取请求URL

基本语法:var url string = ctx.Request.URL

package mainimport ("fmt""github.com/gin-gonic/gin"
)func handleFunc(ctx *gin.Context) {// 获取请求URLvar url string = ctx.Request.URL.String()fmt.Println("请求URL是:" + url)ctx.String(200, "request ok")
}func main() {// 获取引擎对象r := gin.Default()// 设置路由r.GET("/url", handleFunc)// 启动r.Run(":8080")
}

代码运行结果:

2.3.1.3 获取远程IP地址

基本语法:

  • 方式一:var remoteAddr string = ctx.Request.RemoteAddr(包含端口)
  • 方式二:var remoteAddr string = ctx.ClientIP()(不包含端口)
package mainimport ("fmt""github.com/gin-gonic/gin"
)func handleFunc1(ctx *gin.Context) {// 获取远程ipvar addr string = ctx.Request.RemoteAddrfmt.Println("远程ip:", addr)ctx.String(200, "request ok")
}func handleFunc2(ctx *gin.Context) {// 获取远程ipvar addr string = ctx.ClientIP()fmt.Println("远程ip:", addr)ctx.String(200, "request ok")
}func main() {// 获取引擎对象r := gin.Default()// 设置路由r.GET("/addr1", handleFunc1)r.GET("/addr2", handleFunc2)// 启动r.Run(":8080")
}

代码运行结果:

2.3.1.4 获取请求头信息

本语法:var headerInfo string = ctx.GetHeader(键)

package mainimport ("fmt""github.com/gin-gonic/gin"
)func handleFunc(ctx *gin.Context) {// 获取指定请求头var userAgent string = ctx.GetHeader("User-Agent")fmt.Println("Content-Type:", userAgent)ctx.String(200, "request ok")
}func main() {// 获取引擎对象r := gin.Default()// 设置路由r.GET("/header", handleFunc)// 启动r.Run(":8080")
}

代码运行结果:

2.3.2 获取请求数据
2.3.2.1 获取查询字符串内容

通常来说使用 GET 请求发送请求都会将数据放置在查询字符串位置

  • 方式一 :var content string = ctx.Query(键)
  • 方式二:var content string = ctx.DefaultQuery(键, 缺省值),如果不存在则使用默认值填充
  • 方式三:value, ok := ctx.GetQuery(键),可以通过ok判断是否存在键
package mainimport ("fmt""github.com/gin-gonic/gin"
)func handleFunc1(ctx *gin.Context) {// 获取查询字符串数据var username = ctx.Query("username")var pwd = ctx.Query("pwd")fmt.Println("username:", username)fmt.Println("pwd:", pwd)ctx.String(200, "request ok")
}func handleFunc2(ctx *gin.Context) {// 获取查询字符串数据var user = ctx.DefaultQuery("user", "wjj")fmt.Println("user:", user)ctx.String(200, "request ok")
}func handleFunc3(ctx *gin.Context) {// 获取查询字符串数据user, exists := ctx.GetQuery("user")if exists {fmt.Println("键存在,值为:", user)} else {fmt.Println("键不存在!")}ctx.String(200, "request ok")
}func main() {// 获取引擎对象r := gin.Default()// 设置路由r.GET("/queryString1", handleFunc1)r.GET("/queryString2", handleFunc2)r.GET("/queryString3", handleFunc3)// 启动r.Run(":8080")
}

程序运行结果:

2.3.2.2 获取表单数据

前端使用 form表单 提交发送请求,此时Content-Typex-www-form-urlencoded可以使用PostForm获取表单内容

  • 方式一 :var content string = ctx.PostForm(键)
  • 方式二:var content string = ctx.DefaultPostForm(键, 缺省值),如果不存在则使用默认值填充
  • 方式三:value, ok := ctx.GetPostForm(键),可以通过ok判断是否存在键
package mainimport ("fmt""github.com/gin-gonic/gin"
)func handleFunc1(ctx *gin.Context) {// 获取查询字符串数据var username = ctx.PostForm("username")var pwd = ctx.PostForm("pwd")fmt.Println("username:", username)fmt.Println("pwd:", pwd)ctx.String(200, "request ok")
}func handleFunc2(ctx *gin.Context) {// 获取查询字符串数据var user = ctx.DefaultPostForm("user", "wjj")fmt.Println("user:", user)ctx.String(200, "request ok")
}func handleFunc3(ctx *gin.Context) {// 获取查询字符串数据user, exists := ctx.GetPostForm("user")if exists {fmt.Println("键存在,值为:", user)} else {fmt.Println("键不存在!")}ctx.String(200, "request ok")
}func main() {// 获取引擎对象r := gin.Default()// 加载HTML资源r.LoadHTMLGlob("templates/*")// 设置路由r.GET("/", func(ctx *gin.Context) {ctx.HTML(200, "index.html", nil)})r.POST("/postform1", handleFunc1)r.POST("/postform2", handleFunc2)r.POST("/postform3", handleFunc3)// 启动r.Run(":8080")
}

程序运行结果:

2.3.2.3 获取JSON请求体数据

Go语言没有提供类似于 PostForm、Query 这样的API直接获取JSON数据,但是Go提供了ShouldBind函数,可以将 json 类型的数据自动映射到指定的结构体对象上

语法格式:ctx.ShouldBind(&结构体对象)

package mainimport ("fmt""github.com/gin-gonic/gin"
)type Student struct {Username string `json:"username"`Password string `json:"password"`
}func main() {// 获取引擎对象r := gin.Default()// 设置路由r.POST("/", func(ctx *gin.Context) {// 使用ShouldBind函数获取JSON数据var student Studenterr := ctx.ShouldBind(&student)if err != nil {fmt.Println(err)ctx.String(500, "解析错误")} else {fmt.Println(student)ctx.String(200, "request ok")}})// 启动r.Run(":8080")
}

程序运行结果:

2.4 Gin框架返回响应

2.4.1 返回HTML页面

语法格式:ctx.HTML(响应状态码, 页面, 数据对象)

  • 响应状态码:对应的HTTP状态码
  • 页面:具体页面路径
  • 数据对象:与模板引擎相关(后续章节介绍)
package mainimport "github.com/gin-gonic/gin"func main() {// 获取引擎对象r := gin.Default()// 加载模板文件r.LoadHTMLGlob("templates/*")// 设置路由r.GET("/", func(ctx *gin.Context) {// 返回首页ctx.HTML(202, "index.html", nil)})// 启动r.Run(":8080")
}

程序运行结果:

2.4.2 返回String类型

语法格式:ctx.String(响应状态码, 格式化字符串)

  • 响应状态码:对应的HTTP状态码
  • 格式化字符串:具体返回的文本内容
package mainimport "github.com/gin-gonic/gin"func main() {// 获取引擎对象r := gin.Default()// 设置路由r.GET("/", func(ctx *gin.Context) {// 返回sring类型ctx.String(200, "string 类型")})// 启动r.Run(":8080")
}

程序运行结果:

2.4.3 返回JSON类型

语法格式:ctx.JSON(响应状态码, gin.H对象)

  • 响应状态码:对应的HTTP状态码
  • gin.H对象:具体返回JSON格式对象
package mainimport "github.com/gin-gonic/gin"func main() {// 获取引擎对象r := gin.Default()// 设置路由r.GET("/", func(ctx *gin.Context) {// 返回json类型ctx.JSON(200, gin.H{"name": "wjj","age":  21,})})// 启动r.Run(":8080")
}

程序运行结果:

2.4.4 返回XML类型

语法格式:ctx.XML(响应状态码, gin.H对象)

  • 响应状态码:对应的HTTP状态码
  • gin.H对象:具体返回XML格式对象
package mainimport "github.com/gin-gonic/gin"func main() {// 获取引擎对象r := gin.Default()// 设置路由r.GET("/", func(ctx *gin.Context) {ctx.XML(200, gin.H{"name": "wjj","age":  21,})})// 启动r.Run(":8080")
}

程序运行结果:

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VS Code 的扩展下载安装的最新方式

离线包的下载 在 2024年的时候,在VS Code的官方扩展市场:https://marketplace.visualstudio.com/ , 搜索到需要的扩展之后,是可以在对应的页面现在最新版本和几个历史版本的扩展的安装包。 下载下来的扩展包的文件是后缀是 vsix …

【Vue3 入门到实战】3. ref 和 reactive区别和适用场景

目录 ​编辑 1. ref 部分 1.1 ref定义基本数据类型 1.2 ref 定义引用数据类型 2. reactive 函数 3. ref 和 reactive 对比 3.1 原理 3.2 区别 3.3 使用原则 在 Vue 3 中 ref 和 reactive 是用于创建响应式数据的两个核心函数。它们都属于 Composition API 的一部分&…

浅谈云计算07 | 云安全机制

云计算安全机制 一、引言二、加密技术:数据的隐形护盾三、散列机制:数据完整性的忠诚卫士四、数字签名:数据来源与真伪的鉴定专家五、公钥基础设施(PKI):信任的基石六、身份与访问管理(IAM&…

【Sql递归查询】Mysql、Oracle、SQL Server、PostgreSQL 实现递归查询的区别与案例(详解)

文章目录 Mysql 5.7 递归查询Mysql 8 实现递归查询Oracle递归示例SQL Server 递归查询示例PostgreSQL 递归查询示例 更多相关内容可查看 Mysql 5.7 递归查询 MySQL 5.7 本身不直接支持标准 SQL 中的递归查询语法(如 WITH RECURSIVE 这种常见的递归查询方式&#xf…

【Unity3D】【已解决】TextMeshPro无法显示中文的解决方法

TextMeshPro无法显示中文的解决方法 现象解决方法Assets 目录中新建一个字体文件夹在C:\Windows\Fonts 中随便找一个中文字体的字体文件把字体文件拖到第一步创建的文件夹中右键导入的字体,Create---TextMeshPro---Font Asset,创建字体文件资源把 SDF文件…

ShaderJoy —— 如何判别直线是否和二次贝塞尔曲线相交【GLSL】

效果图 关键代码解析 bool IntersectsQuadraticBezier (vec2 src, vec2 dest) {float A = (CONTROL_POINT_A - 2.0 * CONTROL_POINT_B

第十二章:算法与程序设计

文章目录: 一:基本概念 1.算法与程序 1.1 算法 1.2 程序 2.编译预处理 3.面向对象技术 4.程序设计方法 5.SOP标志作业流程 6.工具 6.1 自然语言 6.2 流程图 6.3 N/S图 6.4 伪代码 6.5 计算机语言 二:程序设计 基础 1.常数 …

【BLE】CC2541之ADC

本文最后修改时间:2022年04月12日 23:00 一、本节简介 本文介绍如何通过P05口采集电压值。 二、实验平台 1)CC2541平台 ①协议栈版本:BLE-CC254x-1.4.0 ②编译软件:IAR 10.20.1 ③硬件平台:香瓜CC2541开发板、USB…

SpeingMVC框架(三)

目录 五、响应数据与结果视图 1、返回值分类 2、springmvc的请求转发和重定向 六、异常处理 1、处理思路 2、自定义异常处理器 七、springmvc中的拦截器 1、拦截器概述 2、自定义拦截器步骤 五、响应数据与结果视图 1、返回值分类 返回String:Controller方…

Hadoop3.x 万字解析,从入门到剖析源码

💖 欢迎来到我的博客! 非常高兴能在这里与您相遇。在这里,您不仅能获得有趣的技术分享,还能感受到轻松愉快的氛围。无论您是编程新手,还是资深开发者,都能在这里找到属于您的知识宝藏,学习和成长…

【Vue】分享一个快速入门的前端框架以及如何搭建

先上效果图: 登录 菜单: 下载地址: 链接:https://pan.baidu.com/s/1m-ZlBARWU6_2n8jZil_RAQ 提取码:ui20 … 主要是可以自定义设置token,更改后端请求地址较为方便。 应用设置: 登录与token设置: 在这里设置不用登录,可以请求的接口: request.js i…

汽车免拆诊断案例 | 2007 款法拉利 599 GTB 车发动机故障灯异常点亮

故障现象  一辆2007款法拉利599 GTB车,搭载6.0 L V12自然吸气发动机(图1),累计行驶里程约为6万km。该车因发动机故障灯异常点亮进厂检修。 图1 发动机的布置 故障诊断 接车后试车,发动机怠速轻微抖动,…

Emacs 折腾日记(九)——elisp 数组与序列

elisp 中序列是数组和列表的统称,序列的共性是内部数据有一个先后的顺序,它与C/C 中有序列表类似。 elisp 中的数组包括向量、字符串、char-table 和布尔向量,它们的关系如下: 在之前一章中已经介绍了序列中的一种类型——列表&#xff0c…

Mac玩Steam游戏秘籍!

Mac玩Steam游戏秘籍! 大家好!最近有不少朋友在用MacBook玩Steam游戏时遇到不支持mac的问题。别担心,我来教你如何用第三方工具Crossover来畅玩这些不支持的游戏,简单又实用! 第一步:下载Crossover 首先&…

初识算法和数据结构P1:保姆级图文详解

文章目录 前言1、算法例子1.1、查字典(二分查找算法)1.2、整理扑克(插入排序算法)1.3、货币找零(贪心算法) 2、算法与数据结构2.1、算法定义2.2、数据结构定义2.3、数据结构与算法的关系2.4、独立于编程语言…

Oracle 使用dbms_stats.gather_table_stats来进行表analyse,收集表统计信息

目录 一. 介绍二. 参数说明三. 简易封装四. 效果 一. 介绍 DBMS_STATS.GATHER_TABLE_STATS 用于收集 表 级别的统计信息。这些统计信息有助于查询优化器优化查询计划,影响与表本身相关的查询性能。 Oracle 查询优化器会根据表的统计信息来选择最优的执行计划。当运…

apache-skywalking-apm-10.1.0使用

apache-skywalking-apm-10.1.0使用 本文主要介绍如何使用apache-skywalking-apm-10.1.0,同时配合elasticsearch-8.17.0-windows-x86_64来作为存储 es持久化数据使用。 步骤如下: 一、下载elasticsearch-8.17.0-windows-x86_64 1、下载ES(elasticsear…

Flink系统知识讲解之:容错与State状态管理

Flink系统知识之:容错与State状态管理 状态在Flink中叫作State,用来保存中间计算结果或者缓存数据。根据是否需要保存中间结果,分为无状态计算和有状态计算。对于流计算而言,事件持续不断地产生,如果每次计算都是相互…

Python线性混合效应回归LMER分析大鼠幼崽体重数据、假设检验可视化|数据分享...

全文链接:https://tecdat.cn/?p38816 在数据分析领域,当数据呈现出层次结构时,传统的一般线性模型(GLM)可能无法充分捕捉数据的特征。混合效应回归作为GLM的扩展,能够有效处理这类具有层次结构的数据&…

大疆机场及无人机上云

最近基于大疆上云api进行二次开发,后面将按照开发步骤对其进行说明!