gin框架内容(二)

news2024/11/22 22:08:52

上一篇过于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 main

import (
	"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()

	// 定义一个map
	var m map[string]interface{}

	// 反序列化 别忘了&
	_ = json.Unmarshal(dataBytes, &m)

	// 数据返回
	ctx.JSON(http.StatusOK, m)

}

//文件上传
/*
  单个文件上传
    文件上传接收的文件格式是: multipart/form-data
*/

// singleFileUploadHandle 当文件上传
func singleFileUploadHandle(ctx *gin.Context) {

	// 获取文件
	// 根据上传时的参数名获取上传的文件内容 --> 返回对象为 *multipart.FileHeader
	fileHeader, 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][]string
		File  map[string][]*FileHeader
	*/
	form, err := ctx.MultipartForm()
	if err != nil {
		ctx.JSON(http.StatusInternalServerError, gin.H{
			"message": err.Error(),
		})
		return
	}

	// 获取文件列表,并保存, 返回的是一个切片 []*FileHeader
	files := 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/info
		shopGroup.GET("/info", func(ctx *gin.Context) {
			ctx.JSON(http.StatusOK, "/shop/info")
		})
		// /shop/cart
		shopGroup.GET("/cart", func(ctx *gin.Context) {
			ctx.JSON(http.StatusOK, "/shop/cart")
		})
	}

	//路由组嵌套
	// 绑定路由规则
	shopGroup1 := r.Group("/shop1")
	{
		// shop/book
		shopBookGroup1 := shopGroup1.Group("/book")

		// shop/book/info
		shopBookGroup1.GET("/info", func(ctx *gin.Context) {
			ctx.JSON(http.StatusOK, "shop/book/info")
		})
	}

	// 监听端口
	r.Run(":9000")
}

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

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

相关文章

SDN系统方法 | 7. 叶棘网络

随着互联网和数据中心流量的爆炸式增长,SDN已经逐步取代静态路由交换设备成为构建网络的主流方式,本系列是免费电子书《Software-Defined Networks: A Systems Approach》的中文版,完整介绍了SDN的概念、原理、架构和实现方式。原文: Softwar…

【WIN系统】创建任务计划程序:因为空格问题而无法创建的解决办法

在计算机管理中创建任务计划程序如下图: 【问题】 1. 点击“创建任务”或“创建基本任务” 2. 在操作一栏中,我们可以发现,之前已经存在的任务中,“程序或脚本”不带引号,而且允许存在空格。但自己输入时,…

Cesium 实战 - Blender调整模型组件原点,实现直升机尾翼旋转

Cesium 实战 - Blender调整模型组件原点,实现直升机尾翼旋转 1.模型原点问题2.导入模型(zhisheng.glb)3.导出模型4. 通过 czml 调试代码 某个项目需求,在操作直升机模型的时候,希望直升机机翼和尾翼旋转起来。 机翼旋…

多项目进度把控:选择合适的项目管理系统助力无忧

我相信很多企业都在使用项目管理系统,但你有没有想过为什么要使用这些工具?想象一下,如果我们使用传统的而不是这些项目管理系统,excel或work一些简单的在线文档记录能满足我们的需求吗?当需求发生变化时,这…

前端学习——Vue (Day5)

自定义指令 <template><div><h1>自定义指令</h1><input v-focus ref"inp" type"text" /></div> </template><script> export default {// mounted(){// this.$ref.inp.focus()// }// 2. 局部注册指令di…

桥梁安全监测系统中数据采集上传用 什么?

背景 2023年7月6日凌晨时分&#xff0c;G5012恩广高速达万段230公里加80米处6号大桥部分桥面发生垮塌&#xff0c;导致造成2车受损后自燃&#xff0c;3人受轻伤。目前&#xff0c;四川省公安厅交通警察总队高速公路五支队十四大队民警已对现场进行双向管制。 作为世界第一桥梁…

亚马逊云科技纽约峰会官宣生成式AI产品策略升级

作为云计算领域的领导者和创新者&#xff0c;生成式AI&#xff08;Generative AI&#xff09;一直是亚马逊云科技持续关注和投入的主要方向。在今年4月&#xff0c;亚马逊云科技发布了以Amazon Bedrock为代表的生成式AI产品全家桶&#xff0c;正式入局该赛道并宣布了亚马逊云科…

进程信息查看脚本

一、shell 脚本 该脚本可以根据进程名和进程pid查询进程信息。 输出的进程信息包括&#xff1a;进程 PID、进程命令、进程所属用户、CPU占用率、内存占用率等 查询可选择模式&#xff1a;仅一次还是不限次。 #! /bin/bashprintProcessInfo(){P$1echo "------------------…

15 文本编辑器vim

15.1 建立文件命令 如果file.txt就是修改这个文件&#xff0c;如果不存在就是新建一个文件。 vim file.txt 使用vim建完文件后&#xff0c;会自动进入文件中。 15.2 切换模式 底部要是显示插入&#xff0c;是编辑模式&#xff1b; 按esc&#xff0c;底部要是空白的&#xff0…

NetCore 使用 Swashbuckle 搭建 SwaggerHub

什么是SwaggerHub? Hub 谓之 中心, 所以 SwaggerHub即swagger中心. 什么时候需要它? 通常, 公司都拥有多个服务, 例如商品服务, 订单服务, 用户服务, 等等, 每个服务都有自己的environment, endpoint, swagger schema. 然而这些信息都分散在各处, 如果能集中在一个地方展示…

自主AI代理:未来的生产力引擎

摘要 文章介绍了自主AI代理的概念&#xff0c;AI代理由AI驱动&#xff0c;能够自我创建、优先处理和完成任务。自主AI代理可以执行任何数量的任务&#xff0c;包括内容创建、个人助手、个人财务管理、研究和数据分析等。文章强调了知识、记忆和学习在构建成功的自主AI代理中的重…

任务与项目的巧妙运用:项目管理软件的有效实践方法

如果您不熟悉项目管理或以前依赖任务管理系统来管理您的项目&#xff0c;那么任务和项目之间的区别可能会令人困惑。任务和项目是项目管理软件中的主要构建块&#xff0c;使您能够跟踪和组织您的工作。 任务是需要在项目中完成的单个工作单元。项目是需要一起完成以实现单个结果…

Linux数据处理三剑客

目录&#xff1a; Linux 三剑客之 greplinux三剑客之awklinux三剑客之sedlinux三剑客与管道使用【实战】三剑客实战之nginx日志分析实战【实战】三剑客实战之性能、网络统计实战linux进阶命令linux环境配置Linux与Bash编程实战 1.Linux 三剑客之 grep 内容检索:&#xff08;…

高电压放大器ATA-2021B在无损检测领域中的应用

超声无损检测&#xff08;UltrasonicNondestructiveTesting&#xff0c;简称UT&#xff09;是一种常用的材料及构件内部缺陷检测技术。它利用超声波在材料中传播的特性&#xff0c;通过接收回波信号来检测材料内部的缺陷情况。超声无损检测具有精度高、快速、非破坏性等优点&am…

k8s Webhook 使用java springboot实现webhook 学习总结

k8s Webhook 使用java springboot实现webhook 学习总结 大纲 基础概念准入控制器&#xff08;Admission Controllers&#xff09;ValidatingWebhookConfiguration 与 MutatingWebhookConfiguration准入检查&#xff08;AdmissionReview&#xff09;使用Springboot实现k8s-Web…

【录用案例】2区SCI,仅14天见刊!

近日新增两本2区SCI录用&#xff0c;期刊表现质量优&#xff0c;均是隶属于世界前列的出版社&#xff0c;好刊版面紧俏&#xff0c;可放心投稿&#xff01;录用案例如下&#xff0c;可重点参考&#xff1a; 计算机科学类SCI&EI 【影响因子】IF&#xff08;2022&#xff0…

Microsoft todo 数据导出

文章目录 官方说明&#xff1a; https://support.microsoft.com/zh-cn/office/导出您的-microsoft-待办事项帐户-d286b243-affb-4db4-addc-162e16588943 由于 微软待办 会自动与 Outlook 中的任务同步&#xff0c;因此您可以从 Outlook 中导出所有列表和任务。 若要导出列表和…

Docker 安全 Docker HTTPS请求过程与配置

Docker 容器安全注意点 尽量别做的事 尽量不用 --privileged 运行容器&#xff08;授权容器root用户拥有宿主机的root权限&#xff09; 尽量不用 --network host 运行容器&#xff08;使用 host 网络模式共享宿主机的网络命名空间&#xff09; 尽量不在容器中运行 ssh 服务 尽…

11.对象

11.1什么是对象 ●对象(object) : JavaScript里的一种数据类型 ●可以理解为是一种无序的数据集合&#xff0c;注意数组是有序的数据集合 11.2对象的使用 1.对象的声明语法 &#xff08;1&#xff09;let对象名 {} &#xff08;2&#xff09;let对象名new Object() // {} …

vue实现flv格式视频播放

公司项目需要实现摄像头实时视频播放&#xff0c;flv格式的视频。先百度使用flv.js插件实现&#xff0c;但是两个摄像头一个能放一个不能放&#xff0c;没有找到原因。&#xff08;开始两个都能放&#xff0c;后端更改地址后不有一个不能放&#xff09;但是在另一个系统上是可以…