gin框架内容(二)

news/2024/10/23 5:38:05/

上一篇过于gin的内容

https://mp.csdn.net/mp_blog/creation/editor/131953861

CSDNicon-default.png?t=N6B9https://mp.csdn.net/mp_blog/creation/editor/131953861

 一、路由组

为了管理具有相同前缀的URL, 将拥有URL共同前缀的路由划分为一组

为了代码的阅读性,使用{}包裹相同组的路由不用{}包裹并不影响效果

1.1路由组


为了管理具有相同前缀的URL, 将拥有URL共同前缀的路由划分为一组

为了代码的阅读性,使用{}包裹相同组的路由不用{}包裹并不影响效果

 

 

 上述的两个路由都是在shop这个组下

1.2路由组嵌套

 

 1.3所有代码

package mainimport ("encoding/json""fmt""github.com/gin-gonic/gin""net/http"
)// /user/search?username=zhangsan&address=北京
// urlQuery 获取 url中?后面携带的参数
func urlQueryHandle(ctx *gin.Context) {// 如果指定的key 没有对应的值就使用默认值username1 := ctx.DefaultQuery("username", "lisi")// 根据key 获取值username2 := ctx.Query("username")address := ctx.Query("address")// 返回JSON 字符串ctx.JSON(http.StatusOK, gin.H{"message":   "ok","username1": username1,"username2": username2,"address":   address,})
}// /user/search/lisi/北京。 获取请求URL路径中的参数的方式如下
// paramsPathHandle 获取url path中参数
func paramsPathHandle(ctx *gin.Context) {// 获取参数值username := ctx.Param("username")address := ctx.Param("address")// 数据返回ctx.JSON(http.StatusOK, gin.H{"message":  "ok","username": username,"address":  address,})
}//=================================// formParamsHandle 获取form表单提交数据
func formParamsHandle(ctx *gin.Context) {// 获取不到值时就是用默认值username1 := ctx.DefaultPostForm("username", "lisi")username2 := ctx.PostForm("username")address := ctx.PostForm("address")// 以Json 字符串的形式返回ctx.JSON(http.StatusOK, gin.H{"message":   "ok","username1": username1,"username2": username2,"address":   address,})
}// json参数
// paramsJsonHandle 获取json字符串相关的参数
func paramsJsonHandle(ctx *gin.Context) {// 获取request.Body() 中的数据(这里没有进行错误处理)// 返回的是字节数组dataBytes, _ := ctx.GetRawData()// 定义一个mapvar m map[string]interface{}// 反序列化 别忘了&_ = json.Unmarshal(dataBytes, &m)// 数据返回ctx.JSON(http.StatusOK, m)}//文件上传
/*单个文件上传文件上传接收的文件格式是: multipart/form-data
*/// singleFileUploadHandle 当文件上传
func singleFileUploadHandle(ctx *gin.Context) {// 获取文件// 根据上传时的参数名获取上传的文件内容 --> 返回对象为 *multipart.FileHeaderfileHeader, err := ctx.FormFile("file")if err != nil {ctx.JSON(http.StatusInternalServerError, gin.H{"message": err.Error(),})return}// 保存文件内容// 拼接文件名, 这里直接写死了targetFileName := fmt.Sprintf("C:/Users/黑熊精/Pictures/%s", fileHeader.Filename)//targetFileName := fmt.Sprintf("%s", fileHeader.Filename)// 将文件保存到指定的目录err = ctx.SaveUploadedFile(fileHeader, targetFileName)if err != nil {ctx.JSON(http.StatusInternalServerError, gin.H{"message": err.Error(),})} else {ctx.JSON(http.StatusOK, gin.H{"message": fmt.Sprintf("%s upload success!", fileHeader.Filename),})}
}//多文件上传/**多文件上传
*/// multiFileUploadHandle 多文件上传
func multiFileUploadHandle(ctx *gin.Context) {// form 是一个存储文件信息的结构体/**type Form struct {Value map[string][]stringFile  map[string][]*FileHeader*/form, err := ctx.MultipartForm()if err != nil {ctx.JSON(http.StatusInternalServerError, gin.H{"message": err.Error(),})return}// 获取文件列表,并保存, 返回的是一个切片 []*FileHeaderfiles := form.File["file"]for i, file := range files {targetFileName := fmt.Sprintf("C:/Users/黑熊精/Pictures/%d_%s", i, file.Filename)err = ctx.SaveUploadedFile(file, targetFileName)if err != nil {ctx.JSON(http.StatusInternalServerError, gin.H{"message": err.Error(),})return}}ctx.JSON(http.StatusOK, gin.H{"message": fmt.Sprintf("upload success!"),})
}// shuldbind数据的绑定的办法
// 使用 ShouldBind() 方法, 根据请求方式,自动提取 JSON, form表单 和 Query 类型的参数,放入结构体中
// 用户信息信息结构体
// 加上 binding:"required" 标签,说明该参数是必填的,如果不填就会报错
type UserInfo struct {Username string `json:"username" form:"username" binding:"required"`Address  string `json:"address" form:"address" binding:"required"`
}// 获取query参数
func queryHandle(ctx *gin.Context) {var userInfo UserInfo// 获取数据err := ctx.ShouldBind(&userInfo)if err == nil {ctx.JSON(http.StatusOK, gin.H{"message":  "ok","username": userInfo.Username,"address":  userInfo.Address,})} else {ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})}
}func jsonHandle(ctx *gin.Context) {var userInfo UserInfo// 获取数据err := ctx.ShouldBind(&userInfo)if err == nil {ctx.JSON(http.StatusOK, gin.H{"message":  "ok","username": userInfo.Username,"address":  userInfo.Address,})} else {ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})}
}func fromHandle(ctx *gin.Context) {var userInfo UserInfo// 获取数据err := ctx.ShouldBind(&userInfo)if err == nil {ctx.JSON(http.StatusOK, gin.H{"message":  "ok","username": userInfo.Username,"address":  userInfo.Address,})} else {ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})}
}func main() {// 创建默认路由r := gin.Default()//两种浏览器地址获取参数的办法// 绑定路由规则 /user/search?username=zhangsan&address=北京r.GET("/user/search", urlQueryHandle)// 2. 绑定路由规则/user/search/lisi/北京。 获取请求URL路径中的参数的方式如下r.GET("/user/search/:username/:address", paramsPathHandle)//========================表单提交方法======================// 绑定路由规则r.POST("/user/search", formParamsHandle)//json// 绑定路由规则r.POST("/user/json", paramsJsonHandle)//// 绑定路由规则--文件上传r.POST("/upload/single", singleFileUploadHandle)绑定路由规则--多文件上传r.POST("/upload/multi", multiFileUploadHandle)//使用 ShouldBind() 方法, 根据请求方式,自动提取 JSON, form表单 和 Query 类型的参数,放入结构体中// 绑定路由规则r.GET("/user/query", queryHandle)r.POST("/user/form", fromHandle)r.POST("/user/jsons", jsonHandle)//路由组的使用// 绑定路由规则shopGroup := r.Group("/shop"){// /shop/infoshopGroup.GET("/info", func(ctx *gin.Context) {ctx.JSON(http.StatusOK, "/shop/info")})// /shop/cartshopGroup.GET("/cart", func(ctx *gin.Context) {ctx.JSON(http.StatusOK, "/shop/cart")})}//路由组嵌套// 绑定路由规则shopGroup1 := r.Group("/shop1"){// shop/bookshopBookGroup1 := shopGroup1.Group("/book")// shop/book/infoshopBookGroup1.GET("/info", func(ctx *gin.Context) {ctx.JSON(http.StatusOK, "shop/book/info")})}// 监听端口r.Run(":9000")
}


http://www.ppmy.cn/news/982085.html

相关文章

【算法题】2681. 英雄的力量

题目: 给你一个下标从 0 开始的整数数组 nums ,它表示英雄的能力值。如果我们选出一部分英雄,这组英雄的 力量 定义为: i0 ,i1 ,… ik 表示这组英雄在数组中的下标。那么这组英雄的力量为 max(nums[i0],n…

编写LED驱动,创建三个设备文件,每个设备文件绑定一个设备

驱动代码&#xff1a; #include <linux/init.h> #include <linux/module.h> #include <linux/fs.h> #include <linux/io.h> #include <linux/device.h> #include <linux/uaccess.h> #include <linux/slab.h> #include <linux/cd…

[ 容器 ] Harbor 私有仓库的部署与管理

目录 一、什么是Harbor二、Harbor的特性三、Harbor的构成四、Harbor 部署五、关于 Harbor.cfg 配置文件中有两类参数&#xff1a;所需参数和可选参数六、维护管理Harbor 一、什么是Harbor Harbor 是 VMware 公司开源的企业级 Docker Registry 项目&#xff0c;其目标是帮助用户…

redis数据库

目录 1.关系型数据库与非关系型数据库 关系型数据库 非关系型数据库 区别 2.redis 3.安装redis 1.关系型数据库与非关系型数据库 关系型数据库 关系型数据库是一个结构化的数据库&#xff0c;创建在关系模型&#xff08;二维表格模型&#xff09;基础上&#xff0c;一般面向…

汽车分析,随时间变化的燃油效率

简述 今天我们来分析一个汽车数据。 数据集由以下列组成&#xff1a; 名称&#xff1a;每辆汽车的唯一标识符。MPG&#xff1a;燃油效率&#xff0c;以英里/加仑为单位。气缸数&#xff1a;发动机中的气缸数。排量&#xff1a;发动机排量&#xff0c;表示其大小或容量。马力&…

Python Web 开发及 Django 总结

title: Python Web 开发及 Django 总结 date: 2023-07-24 17:26:26 tags: PythonWeb categories:Python cover: https://cover.png feature: false Python 基础部分见&#xff1a;Python 基础总结 1. 创建项目 1.1 命令行 1、下载安装 Django 在终端输入 pip install djan…

JVM详解(超详细)

目录 JVM 的简介 JVM 执行流程 JVM 运行时数据区 由五部分组成 JVM 的类加载机制 类加载的过程(五个) 双亲委派模型 类加载器 双亲委派模型的优点 JVM 中的垃圾回收策略 GC GC 中主要分成两个阶段 死亡对象的判断算法 引用计数算法 可达性分析算法 垃圾回收算…

Vmware vSphere 5.0系列

Vmware vSphere 5.0 我们都用过 vmware workstation 这款产品&#xff0c;可以使我们安装很多虚拟机&#xff0c;但是 vmware 的核心产品远非局限于 workstation。 vSphere 是 VMware 推出的基于云的新一代数据中心虚拟化套件&#xff0c;提供了虚拟化基础架构、高可用性、集…