Gin框架入门

介绍

  • Gin是一个golang的微框架,封装比较优雅,API友好,源码注释比较明确,具有快速灵活,容错方便等特点

  • 对于golang而言,web框架的依赖要远比Python,Java之类的要小。自身的net/http足够简单,性能也非常不错

  • 借助框架开发,不仅可以省去很多常用的封装带来的时间,也有助于团队的编码风格和形成规范

安装

要安装Gin软件包,您需要安装Go并首先设置Go工作区。

1.首先需要安装Go(需要1.10+版本),然后可以使用下面的Go命令安装Gin。
如果大家是使用GoLand编辑器的话,可以直接在命令行窗口里面运行下面的命令

go get -u github.com/gin-gonic/gin

2.将其导入您的代码中:

import “github.com/gin-gonic/gin”

3.(可选)导入net/http。例如,如果使用常量,则需要这样做http.StatusOK。

import “net/http”

简单案例

package mainimport ("net/http""github.com/gin-gonic/gin"
)func main() {// 1.创建路由r := gin.Default()//创建的Engine// 2.绑定路由规则,执行的函数// gin.Context,封装了request和responser.GET("/:name", func(c *gin.Context) {name := c.Param("name")//参数路由id := c.Query("id")//查询参数c.String(http.StatusOK, "hello World! ,%s ,id is %s", name, id)})// 3.监听端口,默认在8080// Run("里面不指定端口号默认为8080")err := r.Run(":8000")if err != nil {return}
}

执行结果如下:
在这里插入图片描述

这样一个简单Gin使用案例就实现了。接着我们执行该文件,命令行窗口中看到输出监听端口就说明已经启动成功了
在这里插入图片描述
启动失败的最常见原因就是端口失败了,下面是一个端口占用的错误。
在这里插入图片描述

gin.Engine

在Gin里面,一个web服务器被抽象成为Engine。你可以在一个应用里面创建多个Engine实例,监听不同的端口。
Engine承担了路由注册、接入middleware的核心职责。,笔者在查看源码的时候,发现Engine其实是组合了RouterGroup,RouterGroup才是实现路由功能的核心组件。
在这里插入图片描述

gin.Context

gin.Context是Gin里面的核心类型,该类十分重要,我们会频繁与其打交道。
在Gin里面,它的核心职责有两个:

  • 处理请求
  • 返回响应

在这里插入图片描述
上图中的Request代表的就是请求,Writer代表的就是响应。

Gin路由注册

Gin为每一个HTTP方法(最常用的就是Get和Post)都提供了一个注册路由的方法。

基本上都是两个参数:

  • 路由规则:比如说/hello这种静态路由。
  • 处理函数;也就是我们注册的,返回hello,world的方法。

路由分类

  • 静态路由:完全匹配的路由,也就是前面我们注册的hello的路由。
  • 参数路由:在路径中带上了参数的路由。
  • 通配符路由:任意匹配的路由。
	r.GET("/views?id=*.html", func(context *gin.Context) {path := context.Param(".html")context.String(http.StatusOK, "匹配上的值是,%s", path)})

在这里插入图片描述
在这里插入图片描述

该用什么方法?什么路由?

在面对一个业务的时候,该怎么设计路由?

  • 应该用GET方法还是POST方法?
  • 该用路由参数?还是查询参数?还是把参数放到body里面?

适用于初学者的两条原则:

  • 用户是查询数据的,用GET,参数放到查询参数里面,即?a=123这种。
  • 用户是提交数据的,用POST,参数全部放到Body里面。

使用Gin设计一个用户模块相关的接口

对于一个用户模块来说,最先要设计的接口就是:注册和登录。
而后要考虑提供:编辑和查看用户信息。

这里,我们直接定义一个UserHandler,然后将所有和用户有关的路由都定义在这个Handler上,也可以理解用定义在UserHandler上的方法来作为对应路由的处理逻辑。

package webimport ("github.com/gin-gonic/gin""net/http"
)type UserHandler struct {
}func (c *UserHandler) SignUp(ctx *gin.Context) {ctx.String(http.StatusOK, "hello,你在注册")
}func (c *UserHandler) Login(ctx *gin.Context) {ctx.String(http.StatusOK, "hello,你在登录")
}func (c *UserHandler) EditUser(ctx *gin.Context) {ctx.String(http.StatusOK, "hello,你在编辑")
}func (c *UserHandler) UserProfile(ctx *gin.Context) {ctx.String(http.StatusOK, "hello,你在查看")
}func (c *UserHandler) RegisterRoutes(server *gin.Engine) {ug := server.Group("/users")//分组路由ug.POST("/signup", c.SignUp)ug.POST("/login", c.Login)ug.POST("/edit", c.EditUser)ug.GET("/profile", c.UserProfile)
}
package mainimport ("awesomeProject/src/internal/web""github.com/gin-gonic/gin"
)func main() {// 1.创建路由r := gin.Default()// 2.绑定路由规则,执行的函数c := &web.UserHandler{}c.RegisterRoutes(r)// 3.监听端口,默认在8080// Run("里面不指定端口号默认为8080")err := r.Run(":8000")if err != nil {return}
}

接下来,按照一般的流程,前端或者客户端就会调用我们的接口,例如(调用/users/signup接口实现注册功能)将相关的参数传递给后端,通常都是json格式的数据。

那现在,后端拿到相关的数据之后改如何处理呢?
通常分为三步:

  • 接收请求并校验
  • 调用业务逻辑处理请求
  • 根据业务逻辑处理结果返回响应

因此,我们的问题就是怎么在后端接收这个JSON数据?

接收请求数据:接收请求结构体

一般来说,我们都是定义一个结构体来接受数据。

func (c *UserHandler) SignUp(ctx *gin.Context) {//定义在方法内部的好处在于只有该方法能够使用SignUpReqtype SignUpReq struct {Email           string `json:"email"`Password        string `json:"password"`ConfirmPassword string `json:"confirmPassword"`}ctx.String(http.StatusOK, "hello,你在注册")
}

接收请求数据:Bind方法

Bind方法是Gin里面最常用的用于接收请求的方法。
Bind方法会根据HTTP请求的Content-Type来决定怎么处理。比如我们的请求是JSON格式,Content-Type是application/json,那么Gin就会使用JSON来反序列化。
如果Bind方法发现输入有问题,它就会直接返回一个错误响应到前端。这句话怎么理解呢?例如,我们定义的email是string类型,如果前端传过来一个整型的话,那么gin就会直接返回一个400错误码给前端。

func (c *UserHandler) SignUp(ctx *gin.Context) {//定义在方法内部的好处在于只有该方法能够使用SignUpReqtype SignUpReq struct {Email           string `json:"email"`Password        string `json:"password"`ConfirmPassword string `json:"confirmPassword"`}var req SignUpReqif err := ctx.Bind(&req); err != nil {return}//ctx.String(http.StatusOK, "hello,你在注册")ctx.JSON(200, gin.H{"msg": "hello,你在注册",})
}

校验请求

校验请求无可避的需要使用到正则表达式,一般我们获取到参数之后都会对参数进行校验要求其符合一定的格式然后才允许入库。这里就涉及到相关的业务逻辑了,我们暂时抛开不说。
正则匹配库推荐使用一个开源的正则匹配库:https://github.com/dlclark/regexp2,官方自带的正则表达式笔者查阅了一些资料好像是不支持一些语法的。

跨域问题

目前大多数的web框架,都提供了CORS的解决方案。Gin里面提供了一个middleware来解决跨域问题。
执行下面命令即可在代码中使用。

go get github.com/gin-gonic/contrib

熟悉Android中okhttp框架的同学可以用拦截器来理解middleware,所有的请求都会经过这些middleware。所以适合解决一些所有业务都关心的东西。

func (c *UserHandler) RegisterRoutes(server *gin.Engine) {//需要在POST或者GET方法之前调用,无论接口访问成功或失败middleware都会执行server.Use(func(context *gin.Context) {fmt.Println("第一个 middleware")}, func(context *gin.Context) {fmt.Println("第二个 middleware")}, cors.New(cors.Config{AllowCredentials: true,//是否允许带上用户认证信息(比如cookie)AllowedHeaders:   []string{"Content-Type"},//业务请求中可以带上的头AllowOriginFunc: func(origin string) bool {//哪些来源是允许的println("origin is " + origin)if strings.HasPrefix(origin, "http://localhost") {return true}return true},MaxAge: 12 * time.Hour,}))ug := server.Group("/users") //分组路由ug.POST("/signup", c.SignUp)ug.POST("/login", c.Login)ug.POST("/edit", c.EditUser)ug.GET("/profile", c.UserProfile)}

在这里插入图片描述

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

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

相关文章

创建k8s operator

目录 1.前提条件 2.进一步准备 2.1.安装golang 2.2.安装code(vscode的linux版本) 2.3.安装kubebuilder 3.开始创建Operator 3.1.什么是operator? 3.2.GV & GVK & GVR 3.3.创建operator 3.3.1. 生成工程框架 3.3.2.生成api(GVK) …

Unity血条制作

一、使用UGUI制作血条 我一般使用image制作血条,当然,也可以使用滑动组件Slider。image的具体操作步骤如下 普通血条 1、在Hierarchy面板中,创建两个image组件,将其中一个设置为另外一个的子节点 2、在Inspector面板中&#…

UE学习记录03----UE5.2 使用拖拽生成模型

0.创建蓝图控件,自己想要展示的样子 1.侦测鼠标拖动 2.创建拖动操作 3.拖动结束时生成模型 3.1创建actor , 创建变量EntityMesh设为可编辑 生成Actor,创建变量EntityMesh设为可编辑 屏幕鼠标位置转化为3D场景位置 4.将texture设置为变量并设为可编辑&am…

Docker是什么?详谈它的框架、使用场景、优势

作者:Insist-- 个人主页:insist--个人主页 作者会持续更新网络知识和python基础知识,期待你的关注 目录 一、什么是 Docker? 二、Docker 的架构 1、Docker客户端 2、Docker守护进程 3、Docker镜像 4、Docker容器 5、Docker…

【HCIP】15.MPLS基础

多协议标签交换 MPLS位于TCP/IP协议栈中的数据链路层和网络层之间,可以向所有网络层提供服务。 通过在数据链路层和网络层之间增加额外的MPLS头部,基于MPLS头部实现数据快速转发。 术语 MPLS域(MPLS Domain):一系列…

韩顺平java集合

遍历集合方式: public static void main(String[] args) {List<Object> arrayList new ArrayList<>();arrayList.add(1);arrayList.add(3);arrayList.add(111);Iterator<Object> iterator arrayList.iterator();while (iterator.hasNext()){System.out.pri…

数据结构与算法基础-学习-29-图之关键路径

图的其他相关知识点和源码分享可以参考之前的博客&#xff1a; 《数据结构与算法基础-学习-23-图之邻接矩阵与邻接表》&#xff0c; 《数据结构与算法基础-学习-24-图的遍历之DFS&#xff08;深度优先搜索&#xff09;和BFS&#xff08;广度优先搜索&#xff09;》&#x…

自带云盘的内网即时通讯软件,保障数据在公司局域网内安全流通

在信息时代&#xff0c;很多对于内部机密性要求较高的企业&#xff0c;都不惜成本地选择在内网搭建专属的私有化即时通讯系统。企业员工在内部通讯与协同办公的时候&#xff0c;会分享一些文件、文档等资料&#xff0c; 为了保证所有在通讯软件流通的文件&#xff0c;就需要选…

Sui第四轮资助:16个团队瓜分

近日&#xff0c;Sui基金会公布了第四轮开发者资助名单&#xff0c;受助项目均是集中在DeFi、支付、基础设施、游戏、预言机等领域的Sui生态项目&#xff0c;他们是从2023年7月1日之前提交的申请中选出的。在此时间之后提交的任何项目目前正在审查中。 在前三轮资助中累积发放…

视频转音频mp3怎么弄?

视频转音频mp3怎么弄&#xff1f;在很多人看来&#xff0c;音频就是视频中的一部分&#xff0c;其实这时是一定道理的&#xff0c;视频是一种包含图像和有声音的多媒体文件&#xff0c;没有声音的视频是不完美的。时代发展到现在&#xff0c;短视频已经融入了我们生活的方方面面…

百度许少辉著Baidu《乡村振兴战略下传统村落文化旅游设计》图书馆新书通报

百度许少辉著Baidu《乡村振兴战略下传统村落文化旅游设计》图书馆新书通报

什么是变量提升(hoisting)?它在JavaScript中是如何工作的?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 变量提升&#xff08;Hoisting&#xff09;⭐ 变量提升的示例&#xff1a;⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&…

微服务架构2.0--云原生时代

云原生 云原生&#xff08;Cloud Native&#xff09;是一种关注于在云环境中构建、部署和管理应用程序的方法和理念。云原生应用能够最大程度地利用云计算基础设施的优势&#xff0c;如弹性、自动化、可伸缩性和高可用性。这个概念涵盖了许多方面&#xff0c;包括架构、开发、…

【FAQ】H.265视频无插件流媒体播放器EasyPlayer.js播放webrtc断流重连的异常修复

H5无插件流媒体播放器EasyPlayer属于一款高效、精炼、稳定且免费的流媒体播放器&#xff0c;可支持多种流媒体协议播放&#xff0c;可支持H.264与H.265编码格式&#xff0c;性能稳定、播放流畅&#xff0c;能支持WebSocket-FLV、HTTP-FLV&#xff0c;HLS&#xff08;m3u8&#…

ssm网上医院预约挂号系统源码和论文

ssm网上医院预约挂号系统源码和论文051 开发工具&#xff1a;idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 技术&#xff1a;ssm 摘 要 如今的信息时代&#xff0c;对信息的共享性&#xff0c;信息的流通性有着较高要求&#xff0c;因此传统管理方式…

数据结构初阶--排序

目录 一.排序的基本概念 1.1.什么是排序 1.2.排序算法的评价指标 1.3.排序的分类 二.插入排序 2.1.直接插入排序 2.2.希尔排序 三.选择排序 3.1.直接选择排序 3.2.堆排序 重建堆 建堆 排序 四.交换排序 4.1.冒泡排序 4.2.快速排序 快速排序的递归实现 法一&a…

【每日易题】七夕限定——单身狗问题以及进阶问题位运算法的深入探讨

君兮_的个人主页 勤时当勉励 岁月不待人 C/C 游戏开发 Hello,米娜桑们&#xff0c;这里是君兮_&#xff0c;在写这篇博客的前一天是七夕&#xff0c;也是中国传统的“情人节”&#xff0c;不知道各位脱单了吗&#xff1f;碰巧最近刷题时遇到了经典的单身狗问题想带大家深入探…

设计模式概述

文章目录 设计模式概述创建型模式&#xff1a;结构型模式&#xff1a;行为型模式&#xff1a; 设计模式概述 设计模式是什么&#xff1f; 设计模式的一般定义为&#xff1a; 设计模式&#xff08;Design Pattern&#xff09;是一套反复使用、多人知晓的&#xff0c;经过分类…

java电子病历源码 电子病历编辑器源码 病历在线制作、管理和使用

电子病历在线制作、管理和使用的一体化电子病历解决方案&#xff0c;通过一体化的设计&#xff0c;提供对住院病人的电子病历书写、保存、修改、打印等功能。电子病历系统将临床医护需要的诊疗资料以符合临床思维的方法展示。建立以病人为中心&#xff0c;以临床诊疗信息为主线…

echart 图表添加数据分析功能,(右上控制选择)

echart 图表添加数据分析功能,可区域选择数据,右上按钮,控制echart行为 chart.on(globalcursortaken, onGlobalcursortaken); //绑定事件chart.off("brushSelected");//解绑事件处理函数chart.on(brushSelected, renderBrushed);getBarDev2(eIndex, eTimeArr, eSerie…