Gin框架---基础综述

news2024/12/28 3:41:22

目录

    • 一:经典入门案例
    • 二:请求参数
      • 2.1: API参数
      • 2.2: URL参数
      • 2.3: 表单参数
    • 三: 响应参数
    • 四:数据解析和绑定
      • 4.1: JSON数据解析绑定
      • 4.2: FROM表单数据解析和绑定
    • 五: 路由组
    • 六:异步处理
    • 七:中间件
      • 7.1: 全局中间件
      • 7.2: 局部中间件

一:经典入门案例

  • 代码:
    package main
    
    import (
    	"github.com/gin-gonic/gin"
    	"net/http"
    )
    
    func main() {
    	// 1:实例化默认路由
    	r := gin.Default()
    
    	// 2: 编写路由处理函数
    	r.GET("/hello", func(context *gin.Context) {
    		context.String(http.StatusOK, "hello world!!!")
    	})
    
    	// 3: 路由监听端口
    	r.Run(":8080")
    }
    
  • 请求:
    在这里插入图片描述

二:请求参数

2.1: API参数

  • API参数: 参数写在路径中。
  • 注意:
    • 1: 一般用冒号 + 路径参数名称来划分。 冒号的作用是可以让Param方法取到后面的数据。
    • 2: 如果是用星号 + 路径名称,则获取到的是包含路径斜杠+后续的所有内容的。
  • 案例一:
    	package main
    	
    	import (
    		"github.com/gin-gonic/gin"
    		"net/http"
    	)
    	
    	func main() {
    		// 1:实例化默认路由
    		r := gin.Default()
    	
    		// 2: 编写路由处理函数
    		r.GET("/user/:name/:action", func(context *gin.Context) {
    			name := context.Param("name")
    			action := context.Param("action")
    			context.String(http.StatusOK, "name is "+name+", action is "+action+"。")
    		})
    	
    		// 3: 路由监听端口
    		r.Run(":8080")
    	}
    	```
    - 结果, 发送请求:http://127.0.0.1:8080/user/renshanwen/reading
    

在这里插入图片描述

  • 案例二:
    package main
    
    import (
    	"github.com/gin-gonic/gin"
    	"net/http"
    )
    
    func main() {
    	// 1:实例化默认路由
    	r := gin.Default()
    
    	// 2: 编写路由处理函数
    	r.GET("/user/*name_action", func(context *gin.Context) {
    		nameAction := context.Param("name_action")
    		context.String(http.StatusOK, "name_action is "+nameAction)
    	})
    
    	// 3: 路由监听端口
    	r.Run(":8080")
    }
    

在这里插入图片描述

2.2: URL参数

  • URL参数:参数写在请求k-v对中。
  • 使用Query()函数获取参数信息, 获取不到默认获取到空字符串。
  • 案例
    package main
    
    import (
    	"github.com/gin-gonic/gin"
    	"net/http"
    )
    
    func main() {
    	// 1:实例化默认路由
    	r := gin.Default()
    
    	// 2: 编写路由处理函数
    	r.GET("/user", func(context *gin.Context) {
    		name := context.Query("name")
    		age := context.Query("age")
    		context.String(http.StatusOK, "name is "+name+" age is "+age+".")
    	})
    
    	// 3: 路由监听端口
    	r.Run(":8080")
    }
    

在这里插入图片描述

2.3: 表单参数

  • POST请求中的信息, 一般是JSON数据。
  • 使用PostForm函数在表单中获取数据。
  • 案例:
    package main
    
    import (
    	"github.com/gin-gonic/gin"
    	"net/http"
    )
    
    func main() {
    	// 1:实例化默认路由
    	r := gin.Default()
    
    	// 2: 编写路由处理函数
    	r.POST("/user", func(context *gin.Context) {
    		name := context.PostForm("name")
    		age := context.PostForm("age")
    		context.String(http.StatusOK, "name is "+name+" age is "+age+".")
    	})
    
    	// 3: 路由监听端口
    	r.Run(":8080")
    }
    
    

在这里插入图片描述

  • 解析JSON数据
  • 案例:
    package main
    
    import (
    	"github.com/gin-gonic/gin"
    	"net/http"
    	"strconv"
    )
    
    func main() {
    	// 1:实例化默认路由
    	r := gin.Default()
    
    	// 定义一个User结构体
    	type User struct {
    		Name string `json:"name"`
    		Age  int64  `json:"age"`
    	}
    
    	// 2: 编写路由处理函数
    	r.POST("/user", func(context *gin.Context) {
    		// 实例化User
    		reqData := User{}
    		// 将内容绑定到字典中
    		context.BindJSON(&reqData)
    		// 构造响应
    		context.String(http.StatusOK, "name is "+reqData.Name+" age is "+strconv.FormatInt(reqData.Age, 10)+".")
    	})
    
    	// 3: 路由监听端口
    	r.Run(":8080")
    }
    
  • 结果
    在这里插入图片描述

三: 响应参数

  • Gin支持多种响应格式, 例如:json、结构体、XML、YAML类似于java的properties、ProtoBuf。
  • 最常用的就是json。
  • 案例:
    package main
    
    import (
    	"github.com/gin-gonic/gin"
    	"net/http"
    )
    
    func main() {
    	// 1:实例化默认路由
    	r := gin.Default()
    
    	// 定义一个User结构体
    	type User struct {
    		Name string `json:"name"`
    		Age  int64  `json:"age"`
    	}
    
    	// 2: 编写路由处理函数
    	r.POST("/user", func(context *gin.Context) {
    		// 实例化User
    		reqData := User{}
    		// 将内容绑定到字典中
    		context.BindJSON(&reqData)
    		respData := gin.H{
    			"name": "renshanwen",
    			"age":  25,
    		}
    		// 构造响应
    		context.JSON(http.StatusOK, respData)
    	})
    
    	// 3: 路由监听端口
    	r.Run(":8080")
    }
    
  • 结果:
    在这里插入图片描述

四:数据解析和绑定

4.1: JSON数据解析绑定

  • 案例:
package main

import (
	"github.com/gin-gonic/gin"
	"net/http"
)

func main() {
	// 1:实例化默认路由
	r := gin.Default()

	// 定义一个User结构体
	type User struct {
		// 名称 类型   被解析的类型:参数名称 binding:"required"表示必须绑定(请求中必须携带)
		Name string `json:"name" binding:"required"`
		Age  int64  `json:"age"`
	}

	// 2: 编写路由处理函数
	r.POST("/user", func(context *gin.Context) {
		// 实例化User
		reqData := User{}
		// 将内容绑定到字典中
		if err := context.BindJSON(&reqData); err == nil {
			respData := gin.H{
				"name": "renshanwen",
				"age":  25,
			}
			// 构造响应
			context.JSON(http.StatusOK, respData)
		} else {
			context.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		}

	})

	// 3: 路由监听端口
	r.Run(":8080")
}
  • 缺失name测试
    在这里插入图片描述
  • 缺失age测试
    在这里插入图片描述

4.2: FROM表单数据解析和绑定

  • 表单只需要调整一下使用的方法:Bind和定义的类型form
    package main
    
    import (
    	"github.com/gin-gonic/gin"
    	"net/http"
    )
    
    func main() {
    	// 1:实例化默认路由
    	r := gin.Default()
    
    	// 定义一个User结构体
    	type User struct {
    		// 名称 类型   被解析的类型:参数名称 binding:"required"表示必须绑定(请求中必须携带)
    		Name string `form:"name" binding:"required"`
    		Age  int64  `form:"age"`
    	}
    
    	// 2: 编写路由处理函数
    	r.POST("/user", func(context *gin.Context) {
    		// 实例化User
    		reqData := User{}
    		// 将内容绑定到字典中
    		if err := context.Bind(&reqData); err == nil {
    			respData := gin.H{
    				"name": "renshanwen",
    				"age":  25,
    			}
    			// 构造响应
    			context.JSON(http.StatusOK, respData)
    		} else {
    			context.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
    		}
    
    	})
    
    	// 3: 路由监听端口
    	r.Run(":8080")
    }
    
  • 测试
    在这里插入图片描述
    在这里插入图片描述

五: 路由组

  • 作用:根据URL前缀可以分组。
  • 案例:
    package main
    
    import (
    	"github.com/gin-gonic/gin"
    	"net/http"
    )
    
    // 定义一个User结构体
    type User struct {
    	// 名称 类型   被解析的类型:参数名称 binding:"required"表示必须绑定(请求中必须携带)
    	Name string `form:"name" binding:"required"`
    	Age  int64  `form:"age"`
    }
    
    func main() {
    	// 实例化默认路由
    	r := gin.Default()
    
    	// 定义一个路由组
    	userRoutes := r.Group("/user")
    	{
    		userRoutes.POST("/shan", test)
    		userRoutes.POST("/wen", test)
    	}
    	// 路由监听端口
    	r.Run(":8080")
    }
    
    func test(context *gin.Context) {
    	// 实例化User
    	reqData := User{}
    	// 将内容绑定到字典中
    	if err := context.Bind(&reqData); err == nil {
    		respData := gin.H{
    			"name": "renshanwen",
    			"age":  25,
    		}
    		// 构造响应
    		context.JSON(http.StatusOK, respData)
    	} else {
    		context.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
    	}
    }
    
  • 测试
    在这里插入图片描述

六:异步处理

  • 需求:某些处理, 我们可以放在后台去做, 接口要求立刻返回数据。 则可以使用异步处理的方式。
  • 案例
    package main
    
    import (
    	"fmt"
    	"github.com/gin-gonic/gin"
    	"net/http"
    	"time"
    )
    
    // 定义一个User结构体
    type User struct {
    	// 名称 类型   被解析的类型:参数名称 binding:"required"表示必须绑定(请求中必须携带)
    	Name string `form:"name" binding:"required"`
    	Age  int64  `form:"age"`
    }
    
    func main() {
    	// 实例化默认路由
    	r := gin.Default()
    
    	// 定义一个路由组
    	userRoutes := r.Group("/user")
    	{
    		userRoutes.POST("/action", test)
    	}
    	// 路由监听端口
    	r.Run(":8080")
    }
    
    func test(context *gin.Context) {
    	// 实例化User
    	reqData := User{}
    	// 将内容绑定到字典中
    	if err := context.Bind(&reqData); err == nil {
    		respData := gin.H{
    			"name": "renshanwen",
    			"age":  25,
    		}
    
    		// 进行异步处理
    		go func() {
    			for i := 0; i < 10; i++ {
    				fmt.Printf("正在处理 %d \n", i)
    				time.Sleep(3 * time.Second)
    			}
    		}()
    		// 构造响应
    		context.JSON(http.StatusOK, respData)
    	} else {
    		context.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
    	}
    }
    
  • 结果, 先返回了响应, 后进行循环处理。
    在这里插入图片描述

七:中间件

7.1: 全局中间件

  • 所有的请求都经过的中间件。
  • 例如: 所有的请求都经过

7.2: 局部中间件

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【UE】刀光粒子效果——part1

效果 步骤 1. 打开3dsmax&#xff0c;首先新建一个管状体 转成可编辑多边形后&#xff0c;删除多余的面&#xff0c;只保留一层 选择内圈将其拉高5mm 在修改器列表中添加“UVW展开” 点击打开“UV编辑器” 选中左边所有的顶点 将其拖拽到最左边 将右边的点拖拽到最右边 关闭 “…

VR古迹复原——数字化复原圆明园,开创文化遗产保护新方式

圆明园是中国历史上一处重要的文化遗产&#xff0c;曾经被誉为“万园之园”&#xff0c;但在1860年的英法联军侵华战争中被毁。近年来&#xff0c;虚拟现实技术不断发展&#xff0c;广州华锐互动利用VR全景技术复原了圆明园&#xff0c;通过VR设备&#xff0c;人们可以在家中就…

浏览器面试题

浏览器面试题 1.常见的浏览器内核有哪些&#xff1f;2.浏览器的主要组成部分有哪些&#xff1f;3.说一说从输入URL到页面呈现发生了什么&#xff1f;4.浏览器重绘域重排的区别&#xff1f;5.CSS加载会阻塞DOM吗&#xff1f;6.JS会阻塞页面吗&#xff1f;7.说一说浏览器的缓存机…

基于ASP.NET的驾校管理系统设计与实现

摘 要 伴随国民经济的飞速发展和人民生活水平的不断提高&#xff0c;家用汽车在我国逐渐普及。面对不断增长的庞大的用户群&#xff0c;随之产生的驾驶培训行业&#xff0c;规模不断扩大。近年来&#xff0c;随着Internet的迅速发展以及网页制作技术的日臻完善&#xff0c;驾校…

win10查看并设置tomcat的jvm堆内存参数

win10查看并设置tomcat的jvm堆内存参数 查看 进入命令行 通过Winr命令输入cmd进入命令行页面 进入到jdk的bin目录 D: cd D:\Y4ECSRUN\WGQ4 Java jdk1.8.0 131\bin执行jps查看进程pid D:\Y4ECSRUN\WGQ4 Java jdk1.8.0 131\bin>jps 16528 Jps 6868 Bootstrap通过jmap查看…

【客户案例】脊叶架构(Spine-Leaf)的云化园区网络部署实践

前言 各行业数字化转型进程加快&#xff0c;作为基础设施的园区网络也面临着升级压力。为此&#xff0c;星融元通过将先进成熟的云网络建设理念引入园区场景&#xff0c;推出了“云化园区网络解决方案”&#xff0c;帮助客户网络实现架构级的深层优化。 云化园区网络解决方案介…

python 综合练习

条件&#xff1a;ML100k.data 注意&#xff1a;程序对列表进行修改&#xff0c;为避免列表索引出现问题&#xff0c;避免使用for i in range(len(data)),而使用for i in data可避免这一问题 import pickle data [] with open("ML100k.data", r) as file:for line …

从零开始的PICO教程(0) -- 教程大纲

从零开始的PICO教程&#xff08;0&#xff09; – 教程大纲 一、前言 1、写这个教程的原因 第一个原因是&#xff0c;相关教程较少。搜了搜B站和各个搜索引擎&#xff0c;感觉PICO开发这类的教程还比较少&#xff0c;遂记录一下我的学习的过程&#xff0c;为VR生态建设提供一…

左神算法之中级提升班(9)

【案例1】 【题目描述】 【思路解析】 因为它数字的范围只能为1 - n&#xff0c;然后数组范围0 - n-1&#xff0c;所以说如果没有缺失值的话&#xff0c;每个i位置应该放i 1&#xff0c;所以我们直接对每个数组完成这个操作&#xff0c;让每个i位置尽可能放i1&#xff0c;如…

C++(三)——运算符重载

运算符重载 重定义或重载大部分 C 内置的运算符就能使用自定义类型的运算符。重载的运算符是带有特殊名称的函数&#xff0c;函数名是由关键字 operator 和其后要重载的运算符符号构成的。与其他函数一样&#xff0c;重载运算符有一个返回类型和一个参数列表。不能为了重载而重…

GeoServer 安装及使用教程

GeoServer 安装及使用教程 一、前言二、安装1. 下载和安装Java2. 下载、安装、部署GeoServer3. 启动GeoServer4. 发布数据5. 结论 一、前言 GeoServer是一个开源的地理空间数据服务器&#xff0c;可以将地图数据发布为Web服务。在本篇教程中&#xff0c;我们将介绍如何安装GeoS…

B站:AB test [下]

Focus在&#xff1a;AB Test结束后&#xff0c;如何进行显著性检验&#xff1f;&#xff08;以判断改动是否有效果&#xff09; 引入&#xff1a;Z检验和T检验 而T检验适用于 n<30 的小样本 值得注意的是&#xff1a;统计上显著并不意味着现实中显著&#xff01; e.g. 加速…

Vue面试题以及解答(持续扩展中.....)

##Vue面试题## 1.组件中通讯方式有哪些 组件中通讯有$emit&#xff0c;props&#xff0c;vuex&#xff0c;provid和inject&#xff0c;$parent/$children&#xff0c;$refs&#xff0c;全局总线时间EvenBus&#xff0c;订阅与发布模式的subscrip/publish 2.Vue2和Vue3的区别…

尚硅谷大数据项目《在线教育之实时数仓》笔记001

视频地址&#xff1a;尚硅谷大数据项目《在线教育之实时数仓》_哔哩哔哩_bilibili 目录 P001 P002 P003 P004 P005 P001 以在线教育采集系统和离线数仓为前置基础&#xff0c;分为三个部分讲解&#xff1a;实时数仓架构介绍、数仓模型搭建、Suger可视化大屏展示。 P002 P0…

机票预定系统的软件工程分析报告

目 录 1 项目开发计划书……………………………………………………&#xff08;页码&#xff09; 2 软件需求规格说明书………………………………………………&#xff08;页码&#xff09; 3设计规格说明书……………………………………………………&#xff08;页码&…

uni-number-box的坑-无法实现数据双向绑定

业务场景&#xff1a;多规格商品----每一个规格定一个起购量&#xff0c;切换不同规格时动态改变起购数量。 代码&#xff1a; <uni-number-box class"step" ref"ChildComponents" :cid"productSku.productSkuUuid" :min"productSku.s…

STC8单片机PWM定时器+EC11编码器实现计数

STC8单片机PWM定时器+EC11编码器实现计数 📌相关篇《STC单片机+EC11编码器实现调节PWM输出占空比》📍《stc单片机外部中断+EC11编码器实现计数功能》🔖STC8系列支持此功能的型号: ✨从上面的相关篇中有通过通用定时器加外部中断以及常规方法实现驱动EC11编码器的方法。本…

Linux C++ 海康摄像头 Alarm Demo

项目结构 CMakeLists.txt cmake_minimum_required(VERSION 3.7)SET(CMAKE_BUILD_TYPE "Debug") SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb") SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")project(CapPicture…

大规模流量下的云边端一体化流量调度体系

/ 火山引擎是字节跳动旗下的云服务平台&#xff0c; 将字节跳动快速发展过程中积累的增长方法、技术能力和工具开放给外部企业&#xff0c;提供云基础、视频与内容分发、数智平台VeDI、 人工智能、开发与运维等服务&#xff0c;帮助企业在数字化升级中实现持续增长。LiveVid…

在 IntelliJ IDEA 中远程部署 Java 程序

文章目录 远程调试与远程部署的区别远程部署的步骤完整源代码 笔者的运行环境&#xff1a; 客户端&#xff1a; 部署成功过的客户端的 Java 版本&#xff1a; Java 17.0.7 部署成功过的客户端的 Java 程序&#xff1a; Spring Boot 3.1.0 部署成功过的客户端的 IntelliJ IDEA…