gin快速入门

gin

项目地址
晓智科技晓智科技
晓智文档晓智文档
文档源码文档源码

快速体验

func HandlerPong(c *gin.Context) {c.JSON(http.StatusOK, gin.H{"message": "pong",})
}func main() {r := gin.Default()r.GET("/ping", HandlerPong)_ = r.Run(":8080")
}

restful 风格

  • restful 与技术无关,代表的是一种软件架构风格,REST 是 Representational State Transfer 的简称,中文翻译为“表征状态转移”或“表现层状态转化”。
  • RESTFUL 特点包括:
  1. 每一个 URI 代表 1 种资源;
  2. 客户端使用 GET、POST、PUT、DELETE4 个表示操作方式的动词对服务端资源进行操作:GET 用来获取资源,POST 用来新建资源(也可以用于更新资源),PUT 用来更新资源,DELETE 用来删除资源
  3. 通过操作资源的表现形式来操作资源;
  4. 资源的表现形式是 XML 或者 HTML;
  5. 客户端与服务端之间的交互在请求之间是无状态的,从客户端到服务端的每个请求都必须包含理解请求所必需的信息。
func HandlerGet(c *gin.Context) {c.JSON(http.StatusOK, gin.H{"message": "get",})
}func HandlerPost(c *gin.Context) {c.JSON(http.StatusOK, gin.H{"message": "post",})
}func HandlerPut(c *gin.Context) {c.JSON(http.StatusOK, gin.H{"message": "put",})
}func HandlerDelete(c *gin.Context) {c.JSON(http.StatusOK, gin.H{"message": "delete",})
}func main() {r := gin.Default()r.GET("/get", HandlerGet)r.POST("/post", HandlerPost)r.PUT("/put", HandlerPut)r.DELETE("/delete", HandlerDelete)_ = r.Run(":8080")
}

路由分组

  • 在我们实际的开发应用中我们希望能个各个功能模块的路由进行分组,同一个模块的不同路由带有同样的前缀
  • 作用:首先是路由更加的清晰 并且我们在针对某一组路由进行中间件权限校验的时候也比较的方便。
func handleLogin(c *gin.Context) {}func handleSubmit(c *gin.Context) {}func main() {r := gin.Default()v1 := r.Group("/api/v1"){v1.POST("/login", handleLogin)v1.POST("/submit", handleSubmit)}v2 := r.Group("/api/v2"){v2.POST("/login", handleLogin)v2.POST("/submit", handleSubmit)}
}

动态参数获取

  • 在 Gin 框架中,可以使用 c.Param(“paramKey”)来获取动态参数。这里的 paramKey 是你在路由定义中定义的参数名称。
func handleGetInfo(c *gin.Context) {id := c.Param("id")action := c.Param("action")c.JSON(http.StatusOK, gin.H{"id":     id,"action": action,})
}func main() {r := gin.Default()r.GET("/info/:id/:action", handleGetInfo)_ = r.Run(":8080")
}

get 参数获取

  • 获取 GET 参数可以使用 c.Query 函数。这个函数接受一个参数名作为字符串,并返回匹配该参数名的第一个值。如果参数不存在,则返回空字符串。
func handlerGetParams(c *gin.Context) {name := c.DefaultQuery("name", "tom")age := c.DefaultQuery("age", "18")c.JSON(http.StatusOK, gin.H{"name": name,"age":  age,})
}func main() {r := gin.Default()r.GET("/get-params", handlerGetParams)_ = r.Run(":8080")
}

绑定结构体数据

  • 我们可以使用 ShouldBind 系列方法来绑定请求中的数据到 Go 的结构体。这些方法支持 JSON,XML,form 等数据格式。
type Person struct {Id   int    `uri:"id" binding:"required" json:"id"`Name string `uri:"name" binding:"required" json:"name"`
}func handleParams(c *gin.Context) {var person Personif err := c.ShouldBindUri(&person); err != nil {c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})return}c.JSON(http.StatusOK, person)
}func main() {r := gin.Default()r.GET("/ping", handleParams)_ = r.Run(":8080")
}

post 参数获取 form-data 数据

  • 获取 POST 参数可以通过 Context.PostForm()方法来实现。这个方法可以获取到 application/x-www-form-urlencoded 类型的数据。
func handlePostParams(c *gin.Context) {name := c.PostForm("name")age := c.PostForm("age")c.JSON(http.StatusOK, gin.H{"name": name,"age":  age,})
}func main() {r := gin.Default()r.POST("/post-params", handlePostParams)_ = r.Run(":8080")
}

post 参数获取 json

  • 要获取 POST JSON 数据,你可以使用 Context.BindJSON()方法。
type User struct {Name string `json:"name"`Age  int    `json:"age"`
}func handlePostJson(c *gin.Context) {var user Userif err := c.ShouldBindJSON(&user); err != nil {c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})return}c.JSON(http.StatusCreated, user)
}func main() {r := gin.Default()r.POST("/post-json", handlePostJson)_ = r.Run(":8080")
}

返回 protobuf 数据

  • 你需要做的是先将 Protobuf 数据序列化成二进制格式,然后设置正确的响应头,最后将二进制数据写入到 Response 中
//protobuf
syntax = "proto3";option go_package = ".;proto";message Teacher{string name = 1;repeated  string course = 2;
}
//---------------------------------------
func handleProtobuf(c *gin.Context) {teacher := proto.Teacher{Name:   "tom",Course: []string{"python", "java", "go"},}c.ProtoBuf(http.StatusOK, &teacher)
}func main() {r := gin.Default()r.GET("/protobuf", handleProtobuf)_ = r.Run(":8080")
}

from 表单验证 from-data

  • 若要将请求体绑定到结构体中,需要使用模型绑定,支持 JSON、XML、YAML 和标准表单的绑定,设置时需要在绑定的字段上设置 tag,其只要有两套绑定方法
  • Must bind
  1. 方法: Bind 、BindJSON、BindXML、BindQuery、BindYAML
  2. 行为:这些方法底层使用 MustBindWith 方法,如果存在绑定错误,请求将被终止,响应代码会被设置成 400
  • Should bind
  1. 方法: ShouldBind、ShouldBindJSON、ShouldBindXML、ShouldBindQuery、ShouldBindYAML
  2. 行为:底层使用 ShouldBindWith 方法,如果存在绑定错误,则返回 go 语言的错误形式,开发人员可以处理错误,请求不会被终
type LoginForm struct {Name     string `form:"name" binding:"required,min=2,max=10"`Password string `form:"password" binding:"required,min=8,max=20"`
}func handleLogin(c *gin.Context) {var loginForm LoginFormif err := c.ShouldBind(&loginForm); err != nil {c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})return}c.JSON(http.StatusOK, &loginForm)
}func main() {r := gin.Default()r.POST("/login", handleLogin)_ = r.Run(":8080")
}

from 表单验证 json

type User struct {Name     string `json:"name" binding:"required,min=2,max=20"`Password string `json:"password" binding:"required,min=8,max=20"`
}func handleLogin(c *gin.Context) {var user Userif err := c.ShouldBindJSON(&user); err != nil {c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})return}c.JSON(http.StatusOK, &user)
}func main() {r := gin.Default()r.POST("/login", handleLogin)_ = r.Run(":8080")
}

中间件 middleware

  • 中间件(middleware)是一种独立的组件或模块,通常是一个函数或一组函数,常被用于处理请求或事件的过程中
  • 中间件常用来实现一些通用的功能,如日志记录、权限校验、数据加工等
  • 中间件流程控制函数包括:
  1. c.Next(): 调用该函数会将控制权交给下一个中间件函数,如果没有下一个中间件函数,则将控制权交给处理请求的路由处理函数
  2. c.Abort(): 调用该函数会立即终止当前中间件函数的执行,并且不会再调用后续的中间件函数或路由处理函数
  3. c.AbortWithStatus(code int): 调用该函数会终止当前中间件函数的执行,并返回指定的 HTTP 状态码给客户端
  4. c.NextWithError(): 调用该函数会将控制权交给下一个中间件函数,同时传递一个错误给下一个中间件函数或路由处理函数
  5. c.IsAborted(): 该函数用于判断当前请求是否已经被终止,返回一个布尔值表示请求是否已经被终止

func handleUserInfo(c *gin.Context) {c.JSON(200, gin.H{"code": 200,"name": "tom",})
}func main() {r := gin.Default()v1 := r.Group("/api/v1").Use(middleware.Logger()){v1.GET("/info", handleUserInfo)}_ = r.Run(":8080")
}
//------------------------------------------------
// middlewarefunc Logger() gin.HandlerFunc {return func(c *gin.Context) {t := time.Now()c.Set("name", "tom")c.Next()end := time.Since(t)fmt.Println(end)}
}

优雅退出

  • 在 Web 开发中,一个应用程序可能因为多种原因需要关闭,比如接收到关闭信号、处理完所有的请求或者遇到不可恢复的错误。优雅的退出机制可以确保应用程序在关闭过程中,能够完成正在处理的任务,释放资源,并向客户端提供适当的响应,从而保证服务的高可用性和数据的完整性。
func handleExit(c *gin.Context) {c.JSON(200, gin.H{"code": 200,"name": "tom",})
}func main() {r := gin.Default()r.GET("/", handleExit)go func() {_ = r.Run(":8080")}()// 接收信号quit := make(chan os.Signal)signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)<-quitfmt.Println("服务关闭中....")
}

贵州晓智信息科技有限公司

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

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

相关文章

Windows电脑自建我的世界MC服务器并与好友远程联机游戏教程

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

美股收涨,半导体板块领涨;苹果iPhone出货预测上调

市场概况 在昨夜的交易中&#xff0c;美股三大股指全线收涨。道琼斯工业平均指数上涨1.39%&#xff0c;纳斯达克综合指数上涨2.34%&#xff0c;标准普尔500指数上涨1.61%。值得注意的是&#xff0c;英伟达股票涨幅近4%&#xff0c;推动了科技股的整体表现。美国十年期国债收益…

vue3使用i18n实现国际化

安装vue-i18n npm install vue-i18n创建一个ts文件用于存储各种翻译 globalLang.ts的内容如下&#xff1a; export default {"cn": {},"en": {},"de": {},"es": {},"fr": {},"id": {},"it": {},&quo…

【Linux操作系统】进程间通信(1)

目录 一、认识进程间通信二、匿名管道三、命名管道 一、认识进程间通信 进程间不能直接传递数据&#xff0c;因为进程具有独立性&#xff0c;直接传递会破坏进程的独立性。 进程间通信是什么&#xff1f; 一个进程把自己的数据交给另一个进程。 为什么要有进程间通信&#xf…

DAG计算框架:实现业务编排

文章目录 DAG如何实现DAG计算框架Node的实现Engine的实现Graph的实现具体某个节点如何使用 在工作几年之后&#xff0c;大部分人如果还在继续做着 CRUD的简单重复工作&#xff0c;即使领导不提出对你更高的期望&#xff0c;自身也会感到焦虑吧。学如逆水行舟不进则退&#xff…

怎么整合spring security和JWT

什么是spring security spring security是一个安全框架,它里面有过滤器链,可以多次过滤,其实他可以给前端的cookie传入一个jsessionid,都可以不使用jwt也能完成校验 第一步:导入依赖 <!-- springboot security --> <dependency><groupId>org.springframew…

git错误fatal: Unpack error, check server log

git错误fatal: Unpack error, check server log fatal: Unpack error, check server log error: remote unpack failed: error Missing tree xxxxxxxxxxxxxxxxxx 先执行 git fetch 命令&#xff0c;再push。 git拉取远程所有分支/添加远程仓库_git pull所有分支代码-CSDN博客…

OpenGL-ES 学习(8) ---- FBO

目录 FBO OverViewFBO 优点使用FBO的步骤 FBO OverView FBO(FrameBuffer Object) 指的是帧缓冲对象&#xff0c;实际上是一个可以添加缓冲区容器&#xff0c;可以为其添加纹理或者渲染缓冲区对象(RBO) FBO(FrameBuffer Object) 本身不能用于渲染&#xff0c;只有添加了纹理或者…

【C++ Primer Plus习题】3.6

问题: 解答: #include <iostream> using namespace std;int main() {float miles 0;float gallons 0;float gallon 0;cout << "请输入驱车里程(单位为英里):";cin >> miles;cout << "请输入使用的汽油量(单位为加仑):";cin &g…

【Three.js基础学习】19.Custom models with Blender

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 前言 blender模型资源:【blender】一个汉堡包-CSDN博客 一、代码 import ./style.css import * as THREE from three import { OrbitControls } from three/examples/jsm/co…

CentOS服务器三级等保加固

1.密码周期: vim /etc/login.defs max_days:90 mindays:2 minlen:8 warnage:72.密码复杂度: vim /etc/pam.d/system-auth &#xff1a; password requisite pam_cracklib.so retry3 difok3 minlen8 lcredit-1 dcredit-1 ucredit-1 ocredit-1 【Ubuntu系统->vim /etc/pam.d/c…

【STM32】C语言基础补充

学习过程中发现自己好些需要用到的C语言语法、特征都不太熟练了&#xff0c;特意记录一下&#xff0c;免得忘记了&#xff0c;以后遇到了新的也会继续更新 目录 1 全局变量 2 结构体 3 静态变量 4 memset()函数 5 使用8位的存储器存16位的数 1 全局变量…

C++学习笔记----4、用C++进行程序设计(四)---- 复合关系与继承关系之间的细线

在现实世界只是很容易区分对象之间是复合关系还是继承关系。没有人会说桔子有一个水果--而只能是桔子是一种水果。但是&#xff0c;在代码中&#xff0c;有时候就不是那么清晰了。 设想有一个代表关联数组的假想类&#xff0c;将一个键影射到一个值的数据结构。例如&#xff0c…

【Canvas与艺术】环形橄榄枝纹饰

【成图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>环形橄榄枝(draft2)</title><style type"text/css&quo…

MySql 高阶二(SQL 性能分析)

SQL 性能分析&#xff1a; 查看当前数据库的 增删改查的使用情况 show global status like Com_______;慢查询日志&#xff1a; -- 查看状态 show variables like slow_query_log目前是开启状态。如何开启&#xff0c;编辑my.cnf 文件 添加下面的语句&#xff0c;编辑完成后…

Ansible远程自动化运维

目录 概念 安装ansible modules模块和语法 命令行语法 模块 1. command 基础模块 常用的参数 2. shell模块 3. cron定时任务模块 4. user用户管理模块 参数 5. copy复制模块 参数 6. file模块 设置文件属性 参数 实验&#xff1a;批量创建目录 7…

设备实时数据采集:开启制造业智能化、自动化的新篇章

传统制造业在进行生产过程中&#xff0c;会涉及到设备实时数据采集需求&#xff0c;这些数据对于监控生产流程、优化生产效率、保证产品质量以及降低成本等方面至关重要。以下是一些常见的数据采集需求&#xff1a; 1.生产数据&#xff1a;包括生产数量、生产批次、生产速度等&…

如何禁止编辑PDF文件?推荐两种方法!

在日常工作中&#xff0c;我们经常会遇到需要分享重要的PDF文件的情况&#xff0c;但又希望文件内容不被随意更改。为此&#xff0c;设置PDF文件的修改限制是一个非常有效的措施。今天分享两种常见的禁止修改PDF的方法&#xff0c;一起来看看如何设置。 方法一&#xff1a;使用…

FPGA开发——DS18B20读取温度并且在数码管上显示

一、简介 在上一篇文章中我们对于DS18B20的相关理论进行了详细的解释&#xff0c;同时也对怎样使用DS18B20进行了一个简单的叙述。在这篇文章我们通过工程来实现DS18B20的温度读取并且实现在数码管伤显示。 1、基本实现思路 根据不同时刻的操作&#xff0c;我们可以使用一个状…

TCP与UDP传输的学习

void *memset(void *s, int c, size_t n); 功能&#xff1a;将一块内存空间的每个字节都设置为指定的值&#xff1b;这个函数通常用于初始化一个内存空间&#xff0c;或者清空一个空间&#xff1b; 参数&#xff1a;viod * s 空类型指针&#xff0c;指向要填充内存块&#xf…