Go语言Gin框架的基本用法

news2024/12/26 22:03:54

目录

【基本的HTTP请求】

GET请求

POST请求

文件操作

重定向 

HTTP获取三方服务数据 

不同格式的内容输出

异步请求

【中间件】

中间件校验数据

登录中间件

【启动多个服务】 


Gin框架官网:https://gin-gonic.com/zh-cn/,新增一个Go文件,引入 github.com/gin-gonic/gin 即可使用Gin框架。

【基本的HTTP请求】

GET请求

示例代码如下:

package main

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

func main() {
	r := gin.Default()//路由引擎
	r.GET("/get",getMsg) //get方法
	//r.Run("127.0.0.1:9090")
	r.Run(":9090")  //如果不指定IP地址、端口号,默认为本机IP地址、8080端口

}

func getMsg(c *gin.Context) {
	name:=c.Query("name")
	//返回字符串类型数据
	//c.String(http.StatusOK,"欢迎您:%s",name)
	//返回json数据
	c.JSON(http.StatusOK,gin.H{
		"code":http.StatusOK,//状态
		"msg":"成功", //描述信息
		"data":"欢迎您:"+name,//数据
	})
}

浏览器访问 http://127.0.0.1:8080/get?name=zhangsan

POST请求

r.POST("/post", controllers.BasicPostData)

func BasicPostData(c *gin.Context) {
	name := c.DefaultPostForm("name", "Gin") //获取body中的数据(form形式)
	fmt.Println("name", name)
	form, err := c.GetPostForm("name") //获取body中的数据(form形式)
	fmt.Println(form, err)
	c.JSON(http.StatusOK, "欢迎您:"+name)
}

通过postman请求 http://127.0.0.1:8080/post

文件操作

主要演示从服务器下载文件和上传文件到服务器,代码如下:

r.GET("/get-file", controllers.GetFile)
r.POST("/upload-file", controllers.UploadFile)
r.POST("/upload-file-batch", controllers.UploadFileBatch)

// 从服务端获取或下载文件
func GetFile(c *gin.Context) {
	fileName := "/home/rx/Documents/tmp/1.jpeg" //输出图片
	//fileName := "/home/rx/Documents/tmp/file.zip" //下载文件
	c.File(fileName)
}

// 将文件上传到服务端
func UploadFile(c *gin.Context) {
	file, err := c.FormFile("fileName")
	if err != nil {
		c.String(http.StatusBadRequest, "文件上传错误!")
	}
	//存储路径
	dst := "/home/rx/Documents/tmp/"
	c.SaveUploadedFile(file, dst+file.Filename) //存储文件
	c.String(http.StatusOK, fmt.Sprintf("%s 上传完成", file.Filename))
}

// 批量将文件上传到服务端
func UploadFileBatch(c *gin.Context) {
	//多文件的上传
	form, err := c.MultipartForm() //获取form
	if err != nil {
		c.String(http.StatusBadRequest, "上传文件错误")
	}
	files := form.File["fileName"] //上传的所有文件
	dst := "/home/rx/Documents/tmp/"
	//遍历文件
	for _, file := range files {
		c.SaveUploadedFile(file, dst+file.Filename)
	}
	c.String(http.StatusOK, fmt.Sprintf("%d 个文件上传完成!", len(files)))
}

执行效果如下: 

重定向 

//重定向到另外的域名
r.GET("/redirect1", func(c *gin.Context) {
	url := "http://www.baidu.com"                //重定向的URL
	c.Redirect(http.StatusMovedPermanently, url) //301永久重定向
})
//重定向到当前服务的其它路由
r.GET("/redirect2", func(c *gin.Context) {
	c.Request.URL.Path = "/get" //重定向到 http://127.0.0.1:8080/get
	r.HandleContext(c)
})

访问 http://127.0.0.1:8080/redirect1 会直接跳转到 “baidu.com”;访问 http://127.0.0.1:8080/redirect2 页面不会跳转,但会显示 /get 路由的内容。

HTTP获取三方服务数据 

如果你用过PHP,一定知道PHP中有一个强大的函数是CURL,可以通过HTTP请求获取和发送数据与三方服务交互。Gin框架中实现这个功能也很简单,直接看代码:

r.GET("/curl", controllers.BasicCurlData)

func BasicCurlData(c *gin.Context) {
	url := "https://profile-avatar.csdnimg.cn/2334e87504d344588c50c0125c4e39da_rxbook.jpg!1"
	response, err := http.Get(url)
	if err != nil || response.StatusCode != http.StatusOK {
		c.Status(http.StatusServiceUnavailable)
		return
	}
	body := response.Body
	contentLength := response.ContentLength
	contentType := response.Header.Get("Content-Type")
	//数据写入响应体
	c.DataFromReader(http.StatusOK, contentLength, contentType, body, nil)
}

请求 http://127.0.0.1:8080/curl 可以获取到设定的URL中的内容。

不同格式的内容输出

可以输出JSON、XML、YAML等格式:

r.GET("/output", controllers.Output)

func Output(c *gin.Context) {
	flag := c.Query("flag")
	if flag == "json" {
		outputJson(c)
	} else if flag == "xml" {
		outputXML(c)
	} else if flag == "yaml" {
		outputYAML(c)
	}
}

// 输出json
func outputJson(c *gin.Context) {
	c.JSON(http.StatusOK, gin.H{
		"code":    200,
		"message": "success",
	})
}

// 输出XML
func outputXML(c *gin.Context) {
	type Message struct {
		Code    int
		Message string
	}
	info := Message{}
	info.Code = 200
	info.Message = "Success"
	c.XML(http.StatusOK, info)
}

// 输出YAML
func outputYAML(c *gin.Context) {
	c.YAML(http.StatusOK, gin.H{
		"code":    200,
		"message": "输出YAML内容",
	})
}

异步请求

假设某个方法需要执行一段很耗时的任务,如果是同步执行,效果如下:

func BasicPostData(c *gin.Context) {
	//耗时任务
	//同步执行三个任务
	for i := 0; i < 3; i++ {
		longTimeCost(c, i)
	}
}

func longTimeCost(cp *gin.Context, i int) {
	println("第" + strconv.Itoa(i) + "个任务开始执行:" + cp.Request.URL.Path)
	time.Sleep(time.Second * 5)
	println("第" + strconv.Itoa(i) + "个任务执行完毕")
}

改成异步:

//异步执行三个任务
for i := 0; i < 3; i++ {
	go longTimeCost(c, i)
}

【中间件】

中间件校验数据

使用中间件可以对数据进行规则校验,比如校验用户名是否合法,金额是否是数字类型等等。下面是一个简单的示例,校验token是否合法:

func Router() *gin.Engine {
	r := gin.Default() //默认路由引擎:包括 Logger and Recovery middleware
	//r:=gin.New() //没有任何中间件的路由引擎
	r.Use(service.Middleware()) //中间件校验
    r.POST("/post", controllers.BasicPostData)
    return r
}

// 中间件校验数据
func Middleware() gin.HandlerFunc {
	return func(c *gin.Context) {
		fmt.Println(">> 中间件执行开始 <<")
		token := c.Query("token")
		if token != "123456" {
			c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{
				"code": http.StatusBadRequest,
				"msg":  "token错误",
				"data": nil,
			})
			return
		}
		fmt.Println(">> 中间件执行结束 <<")
		c.Next() //执行后续操作
	}
}

然后再调用接口,如果token不正确则会被拦截:

登录中间件

使用Gin框架自带的 `BasicAuth` 方法可以快速实现一个用户登录校验的中间件,代码如下:

func Router() *gin.Engine {
	r := gin.Default() //默认路由引擎:包括 Logger and Recovery middleware
	//r:=gin.New() //没有任何中间件的路由引擎
    r.Use(service.AuthMiddleware()) //登录中间件校验
    r.POST("/get", controllers.BasicGetData)
    return r
}

// 登录中间件
func AuthMiddleware() gin.HandlerFunc {
	//初始化用户
	accounts := gin.Accounts{ // gin.Accounts 是 map[string]string 类型
		"admin":    "123456",
		"zhangsan": "888888",
	}
	//动态添加用户
	accounts["lisi"] = "666666"
	accounts["wangwu"] = "777777"
	//将用户添加到登录中间件中
	auth := gin.BasicAuth(accounts)

    //获取登录的用户信息
	loginUserName := c.MustGet(gin.AuthUserKey).(string)
	fmt.Println("loginUserName", loginUserName)

	return auth
}

打开浏览器的访问效果(第一次需要输入用户名和密码,下次不需要,直到重新打开浏览器):

【启动多个服务】 

在一个Gin框架中启动多个服务,代码如下:

package main

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"golang.org/x/sync/errgroup"
	"net/http"
	"time"
)

var g errgroup.Group

func main() {
	//服务器1:
	server01 := &http.Server{
		Addr:         ":8081",
		Handler:      router01(),
		ReadTimeout:  5 * time.Second,  //读取超时时间
		WriteTimeout: 10 * time.Second, //写入超时时间
	}
	//服务器2:
	server02 := &http.Server{
		Addr:         ":8082",
		Handler:      router02(),
		ReadTimeout:  5 * time.Second,
		WriteTimeout: 10 * time.Second,
	}
	//开启服务
	g.Go(func() error { //开启服务器程序1
		return server01.ListenAndServe()
	})
	g.Go(func() error { //开启服务器程序2
		return server02.ListenAndServe()
	})
	//让监听程序一直处于等待状态
	if err := g.Wait(); err != nil {
		fmt.Println("执行失败:", err)
	}
}

func router01() http.Handler {
	r1 := gin.Default()
	r1.GET("/", func(c *gin.Context) {
		c.JSON(http.StatusOK, gin.H{
			"code": http.StatusOK,
			"msg":  "服务器01的响应",
		},
		)
	})
	return r1
}

func router02() http.Handler {
	r1 := gin.Default()
	r1.GET("/", func(c *gin.Context) {
		c.JSON(http.StatusOK, gin.H{
			"code": http.StatusOK,
			"msg":  "服务器02的响应",
		},
		)
	})
	return r1
}

运行后,分别访问两个端口:

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

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

相关文章

为机器人装“大脑” 谷歌发布RT-2大模型

大语言模型不仅能让应用变得更智能&#xff0c;还将让机器人学会举一反三。在谷歌发布RT-1大模型仅半年后&#xff0c;专用于机器人的RT-2大模型于近期面世&#xff0c;它能让机器人学习互联网上的文本和图像&#xff0c;并具备逻辑推理能力。 该模型为机器人智能带来显著升级…

光线追踪会影响3D渲染速度吗?

什么是光线追踪&#xff1f; 光线追踪 是模拟光源在现实生活中如何反应的方法。它追踪光线到达物体的路径&#xff0c;真实地模拟光线如何反射回来&#xff0c;以创建准确的反射、折射、阴影和间接照明。 我们在光线追踪中经常遇到的术语之一是路径追踪。它们是一样的吗&#x…

有什么进行仓库出入库管理的软件?

公司的仓库管理一直都是难题&#xff0c;不论是仓库进货发货&#xff0c;还是仓库储存&#xff0c;每一步都至关重要。其实对于仓库管理系统来说&#xff0c;主要包括以下三个需求&#xff1a; 1.录入商品信息2.记录进出货过程3.查询分析仓库数据 那么有哪些进行仓库出入库管…

【Spring Boot】请求参数传json对象,后端采用(pojo)CRUD案例(102)

请求参数传json对象&#xff0c;后端采用&#xff08;pojo&#xff09;接受的前提条件&#xff1a; 1.Spring Boot 的启动类加注解&#xff1a;EnableWebMvc 2.Spring Boot 的控制层接受参数采用&#xff1a;RequestBody Spring Boot 启动类&#xff1a;加注解&#xff1a;En…

03 制作Ubuntu启动盘

1 软碟通 我是用软碟通制作启动盘。安装软碟通时一定要把虚拟光驱给勾选上&#xff0c;其余两个可以看你心情。 2 镜像文件 我使用清华镜像网站找到的Ubuntu镜像文件。 Index of /ubuntu-releases/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 请自己选择镜像…

关于视频汇聚融合EasyCVR平台多视频播放协议的概述

视频监控综合管理平台EasyCVR具备视频融合能力&#xff0c;平台基于云边端一体化架构&#xff0c;具有强大的数据接入、处理及分发能力&#xff0c;平台既具备传统安防视频监控的能力与服务&#xff0c;也支持AI智能检测技术的接入&#xff0c;可应用在多行业领域的智能化监管场…

【实操教程】如何开始用Qt Widgets编程?(一)

Qt 是目前最先进、最完整的跨平台C开发工具。它不仅完全实现了一次编写&#xff0c;所有平台无差别运行&#xff0c;更提供了几乎所有开发过程中需要用到的工具。如今&#xff0c;Qt已被运用于超过70个行业、数千家企业&#xff0c;支持数百万设备及应用。 在本文中&#xff0…

矩阵按键行列扫描法与反转扫描法:原理、代码实现

矩阵按键&#xff1a;行列扫描法与反转扫描法 通常情况下&#xff0c;按键按下时会产生低电平信号&#xff0c;按键一般用低电平表示按下状态。 当按键没有被按下时&#xff0c;通常处于高电平状态&#xff0c;这是因为按键连接到电路时&#xff0c;内部的上拉电阻或外部的上拉…

快速创建vue3+vite+ts项目

安装nodejs 创建项目 npm init vitelatest 默认之后回车 选择项目名字my-vue-project 选择vue框架 选择ts 运行项目 cd my-vue-project npm install --registryhttps://registry.npm.taobao.org npm run dev

2023年第四届“华数杯”数学建模思路 - 案例_ ID3-决策树分类算法

文章目录 0 赛题思路1 算法介绍2 FP树表示法3 构建FP树4 实现代码 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 算法介绍 FP-Tree算法全称是FrequentPattern Tree算法&#xff0c;就是频繁模式树算法&…

容器技术:Docker搭建(通俗易懂)

目录 Docker搭建环境准备Docker安装1、查看服务器是否安装Docker2、卸载Docker3、安装Dokcer依赖环境4、配置Docker国内阿里云镜像5、安装Docker6、查看Docker信息7、配置阿里云镜像加速8、镜像安装10、运行实例11、查看实例状态12、测试 Docker命令集合 Docker搭建 环境准备 …

华为OD机试真题 JavaScript 实现【云短信平台优惠活动】【2023Q1 200分】,附详细解题思路

目录 一、题目描述二、输入描述三、输出描四、解题思路五、JavaScript算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 刷的越多&#xff0c;抽中的概率越大&#xff0c;每一题都有详细的答题思路、详细的代码注释、样例测…

Linux - 进程概念

1.冯诺依曼体系结构 我们常见的计算机&#xff0c;如笔记本。我们不常见的计算机&#xff0c;如服务器&#xff0c;大部分都遵守冯诺依曼体系 截至目前&#xff0c;我们所认识的计算机&#xff0c;都是由一个个的硬件组件组成 ● 输入单元&#xff1a;包括键盘, 鼠标&#xff0…

VMWare vSphere 7.0.3环境通过PowerCLI批量修改虚拟机网卡的连接状态及开机连接设置

为避免网络IP冲突&#xff0c;虚拟机模板的网卡设置是连接中断、开机连接中断的&#xff0c;在通过PowerCLI批量发布虚拟机后&#xff0c;本文尝试PowerCLI通过PowerCLI批量修改虚拟机网卡的连接状态及开机连接设置。 一、PowerCLI环境搭建 详见前文 VMWare vSphere 7.0.3环…

MySQL 在CentOS下安装

yum安装 1、yum源安装 yum install mariadb-server2、启动MySQL服务 systemctl start mariadb3、查看运行状态 systemctl status mariadb4、设置初始密码 mysql -u rootuse mysql;update user set passwordpassword("root")where userroot;flush privileges;e…

AI为图像构建测谎仪

互联网上充斥着有趣的假照片——从汽车上飞驰的鲨鱼和奶牛到令人眼花缭乱的名人混搭。然而&#xff0c;卷积神经网络&#xff08;CNNs&#xff09;生成的超现实图像和视频赝品绝非笑料——事实上&#xff0c;它们可能非常危险。Deepfake色情在2018年抬头&#xff0c;世界领导人…

DataSphere Studio- 1.1.1 安装部署(自动化脚本)

DSSLinkis Ansible一键安装脚本 DSS1.1.1 & Linkis 1.3.0 Ansible 一键部署脚本 作者&#xff1a;wubolive Q Q&#xff1a;1049635685 邮箱&#xff1a;wubolivefoxmai.com Github&#xff1a;https://github.com/wubolive/dss-linkis-ansible 一、简介 为解决繁琐…

Linux - 进程概念(进程状态、优先级)

1.进程状态 操作系统中进程有多种状态模型 三态模型 进程状态分为 就绪态&#xff0c;执行态&#xff0c;阻塞态。 就绪(Ready)状态&#xff1a;指进程已处于准备好运行的状态&#xff0c;即进程已分配到除CPU以外的所有必要资源后&#xff0c;只要再获得CPU&#xff0c;便可立…

分布式服务高可用实现:复制 | 京东物流技术团队

1. 为什么需要复制 我们可以考虑如下问题&#xff1a; 当数据量、读取或写入负载已经超过了当前服务器的处理能力&#xff0c;如何实现负载均衡&#xff1f; 希望在单台服务器出现故障时仍能继续工作&#xff0c;这该如何实现&#xff1f; 当服务的用户遍布全球&#xff0c;…