go之web框架gin

介绍

Gin 是一个用 Go (Golang) 编写的 Web 框架。 它具有类似 martini 的 API,性能要好得多,多亏了 httprouter,速度提高了 40 倍。 如果您需要性能和良好的生产力,您一定会喜欢 Gin。

安装

go get -u github.com/gin-gonic/gin

快速开始

package mainimport ("github.com/gin-gonic/gin"
)func main() {r := gin.Default()r.GET("/ping", func(c *gin.Context) {c.JSON(200, gin.H{"message": "pong",})})r.Run() // 监听并在 0.0.0.0:8080 上启动服务
}

接受请求参数

公共部分

package mainimport ("github.com/gin-gonic/gin""net/http"
)func main() {router := gin.Default()//调用方法router.Run(":8080")
}

get请求

获取路径上数据(post一样)

使用gin.Context.Query("参数名")获取

func main() {router := gin.Default()testGetUrl(router)router.Run(":8080")
}
func testGetUrl(router *gin.Engine) {router.GET("/getUrl", func(c *gin.Context) {// 获取参数值name := c.Query("name")age := c.Query("age")// 返回响应c.JSON(http.StatusOK, gin.H{"name": name,"age":  age,})})
}

获取路由参数(post一样)

package mainimport ("github.com/gin-gonic/gin""io""net/http""net/url""os"
)func main() {router := gin.Default()testRouteParams(router)router.Run(":8080")
}
func testRouteParams(router *gin.Engine) {router.GET("/routeParams/:name/:age", func(c *gin.Context) {// 获取参数值name := c.Param("name")age := c.Param("age")// 返回响应c.JSON(http.StatusOK, gin.H{"name": name,"age":  age,})})
}

获取cookie(post一样)

package mainimport ("github.com/gin-gonic/gin""io""net/http""net/url""os"
)func main() {router := gin.Default()testCookies(router)router.Run(":8080")
}
func testCookies(router *gin.Engine) {router.GET("/cookies", func(c *gin.Context) {// 获取参数值name, _ := c.Cookie("name")age, _ := c.Cookie("age")// 返回响应c.JSON(http.StatusOK, gin.H{"name": name,"age":  age,})})
}

 

获取表单参数(post一样)

func main() {router := gin.Default()testGetForm(router)router.Run(":8080")
}
func testGetForm(router *gin.Engine) {router.GET("/getForm", func(c *gin.Context) {var form User// 在这种情况下,将自动选择合适的绑定if c.ShouldBind(&form) == nil {// 返回响应c.JSON(http.StatusOK, gin.H{"name": form.Name,"age":  form.Age,})}})
}

获取请求头(post一样)

func main() {router := gin.Default()testGetHeader(router)router.Run(":8080")
}
func testGetHeader(router *gin.Engine) {router.GET("/getHeader", func(c *gin.Context) {// 获取参数值name := c.GetHeader("name")age := c.GetHeader("age")contentType := c.GetHeader("Content-Type")// 返回响应c.JSON(http.StatusOK, gin.H{"name":        name,"age":         age,"contentType": contentType,})})
}

 

post请求

获取请求体数据

和post表单一样 

func main() {router := gin.Default()testPostForm(router)router.Run(":8080")
}
func testPostForm(router *gin.Engine) {router.POST("/postForm", func(c *gin.Context) {var form User// 在这种情况下,将自动选择合适的绑定if c.ShouldBind(&form) == nil {// 返回响应c.JSON(http.StatusOK, gin.H{"name": form.Name,"age":  form.Age,})}})
}

 文件上传下载

上传单个文件

package mainimport ("github.com/gin-gonic/gin""net/http"
)func main() {router := gin.Default()testUpload(router)router.Run(":8080")
}
func testUpload(router *gin.Engine) {// 为 multipart forms 设置较低的内存限制 (默认是 32 MiB)router.MaxMultipartMemory = 8 << 20 // 8 MiBrouter.POST("/upload", func(c *gin.Context) {// 单文件file, _ := c.FormFile("file")dst := file.Filename// 上传文件至指定的完整文件路径c.SaveUploadedFile(file, dst)// 返回响应c.JSON(http.StatusOK, gin.H{"name": file.Filename,})})
}

 

上传多个文件

package mainimport ("github.com/gin-gonic/gin""net/http"
)func main() {router := gin.Default()testUploadMany(router)router.Run(":8080")
}
func testUploadMany(router *gin.Engine) {// 为 multipart forms 设置较低的内存限制 (默认是 32 MiB)router.MaxMultipartMemory = 8 << 20 // 8 MiBrouter.POST("/uploadMany", func(c *gin.Context) {// Multipart formform, _ := c.MultipartForm()fileNames := make([]string, 0)files := form.File["fileList"]for _, file := range files {// 上传文件至指定目录c.SaveUploadedFile(file, "filedir/"+file.Filename)fileNames = append(fileNames, file.Filename)}// 返回响应c.JSON(http.StatusOK, gin.H{"name": fileNames,})})
}

 

 

下载文件 

package mainimport ("github.com/gin-gonic/gin""io""net/http""net/url""os"
)func main() {router := gin.Default()testDownload(router)router.Run(":8080")
}
func testDownload(router *gin.Engine) {router.POST("/download", func(c *gin.Context) {// 获取文件路径targetFileName := "照片1.png"filePath := "filedir/" + targetFileName// 检查文件是否存在_, err := os.Stat(filePath)if os.IsNotExist(err) {c.String(http.StatusNotFound, "File not found")return}//中文名称会乱码,导致下载失败,所以需要编码name := url.QueryEscape(targetFileName)// 设置响应头,指定文件名和内容类型c.Header("Content-Disposition", "attachment; filename="+name)c.Header("Content-Type", "application/octet-stream")// 打开文件file, err := os.Open(filePath)if err != nil {c.String(http.StatusInternalServerError, "Error opening file")return}defer file.Close()// 将文件内容写入响应体_, err = io.Copy(c.Writer, file)if err != nil {c.String(http.StatusInternalServerError, "Error copying file")return}})
}

由于是postman下载的,没法解析为中文,用浏览器下载就没问题了

日志

func main() {// 禁用控制台颜色,将日志写入文件时不需要控制台颜色。gin.DisableConsoleColor()// 记录到文件。f, _ := os.Create("gin.log")gin.DefaultWriter = io.MultiWriter(f)// 如果需要同时将日志写入文件和控制台,请使用以下代码。// gin.DefaultWriter = io.MultiWriter(f, os.Stdout)router := gin.Default()router.GET("/ping", func(c *gin.Context) {c.String(200, "pong")})router.Run(":8080")
}

路由组

func main() {router := gin.Default()// 简单的路由组: v1v1 := router.Group("/v1"){v1.POST("/login", loginEndpoint)v1.POST("/submit", submitEndpoint)v1.POST("/read", readEndpoint)}// 简单的路由组: v2v2 := router.Group("/v2"){v2.POST("/login", loginEndpoint)v2.POST("/submit", submitEndpoint)v2.POST("/read", readEndpoint)}router.Run(":8080")
}

运行多个服务

package mainimport ("log""net/http""time""github.com/gin-gonic/gin""golang.org/x/sync/errgroup"
)var (g errgroup.Group
)func router01() http.Handler {e := gin.New()e.Use(gin.Recovery())e.GET("/", func(c *gin.Context) {c.JSON(http.StatusOK,gin.H{"code":  http.StatusOK,"error": "Welcome server 01",},)})return e
}func router02() http.Handler {e := gin.New()e.Use(gin.Recovery())e.GET("/", func(c *gin.Context) {c.JSON(http.StatusOK,gin.H{"code":  http.StatusOK,"error": "Welcome server 02",},)})return e
}func main() {server01 := &http.Server{Addr:         ":8080",Handler:      router01(),ReadTimeout:  5 * time.Second,WriteTimeout: 10 * time.Second,}server02 := &http.Server{Addr:         ":8081",Handler:      router02(),ReadTimeout:  5 * time.Second,WriteTimeout: 10 * time.Second,}g.Go(func() error {return server01.ListenAndServe()})g.Go(func() error {return server02.ListenAndServe()})if err := g.Wait(); err != nil {log.Fatal(err)}
}

重定向

HTTP 重定向很容易。 内部、外部重定向均支持。

r.GET("/test", func(c *gin.Context) {c.Redirect(http.StatusMovedPermanently, "http://www.google.com/")
})

通过 POST 方法进行 HTTP 重定向。请参考 issue:#444

r.POST("/test", func(c *gin.Context) {c.Redirect(http.StatusFound, "/foo")
})

路由重定向,使用 HandleContext

r.GET("/test", func(c *gin.Context) {c.Request.URL.Path = "/test2"r.HandleContext(c)
})
r.GET("/test2", func(c *gin.Context) {c.JSON(200, gin.H{"hello": "world"})
})

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

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

相关文章

【测试篇】接口测试

接口测试&#xff0c;可以用可视化工具 postman。 如何做接口测试&#xff1f;&#xff1f; 我们可以先在浏览器中随机进入一个网页&#xff0c;打开开发者工具&#xff08;F12&#xff09;。 随便找一个接口Copy–>Copy as cURL(bash) 打开postman 复制地址 进行发送。 …

R统计实战:详解机器学习Adaboost的操作步骤与应用

一、引言 机器学习是人工智能的核心领域之一&#xff0c;其重要性体现在其能够从数据中自动学习并改进的能力上。在实际问题中&#xff0c;机器学习已经被广泛应用于各个领域&#xff0c;包括但不限于金融、医疗、电子商务、社交网络等。例如&#xff0c;在金融领域&#xff0c…

maven打包本地依赖打进去

在 Maven 项目中&#xff0c;如果你需要包含本地的 jar 包依赖&#xff0c;并希望这些依赖在打包的时候被包含进去&#xff0c;可以通过以下方式解决这个问题&#xff0c;这是最推荐的方法&#xff0c;因为它符合 Maven 的依赖管理方式&#xff0c;并且可以确保这些依赖在打包时…

Java SpringBoot中优雅地判断一个对象是否为空

在Java中&#xff0c;可以使用以下方法优雅地判断一个对象是否为空&#xff1a; 使用Objects.isNull()方法判断对象是否为空&#xff1a; import java.util.Objects;if (Objects.isNull(obj)) {// obj为空的处理逻辑 }使用Optional类优雅地处理可能为空的对象&#xff1a; impo…

基于 Spring Task实现单体项目架构的定时任务

文章目录 引言I JDK 实现任务调度II Spring Task实现2.1 开启Spring的计划任务支持2.2 标注方法为计划任务2.3 创建任务自己的独立线程III 预备知识: cronExpression 表达式引言 需求: 定时更新数据到redis缓存、生成定时报表。 实现方式: Timer 是 JDK 自带的定时任务工具…

Node.js知识点总结:从入门到入土

Node.js知识点总结&#xff1a;从入门到入土 node.js概念说明与相关知识储备了解基本概念&#xff1a;JavaScript基础能力&#xff1a;安装和设置Node.js环境&#xff1a;核心能力模块&#xff1a;重点能力-异步编程&#xff1a;使用npm管理依赖&#xff1a;构建Web应用&#x…

回溯大学生活

回顾一下大学四年 bg&#xff1a;湖南大学 20级计科&#xff0c;成绩60%&#xff0c;无考研考公打算 四年之前&#xff0c;怀着激动的心情来到了大学校园&#xff0c;经过了太久的压抑终于迎来了高中老师口中的美好的大学生活&#xff0c;然而呢事实并非如此。恋爱呢&#xf…

JVM将虚拟机分成了哪几块区域?

Java 8之后&#xff0c;JVM&#xff08;Java Virtual Machine&#xff09;继续沿用原有的内存区域划分&#xff0c;主要包括以下几个部分&#xff1a; 1、堆&#xff08;Heap&#xff09;&#xff1a; 用途&#xff1a;存储对象实例&#xff0c;几乎所有通过new关键字创建的对…

安全架构设计理论与实践相关知识总结

一、安全架构概述 常见信息威胁介绍&#xff1a; 1. 信息泄露&#xff1a;信息被泄露或透露给某个非授权实体 2. 破坏信息完整性&#xff1a;数据被非授权地进行增删改查货破坏而受到损失 3. 拒绝服务&#xff1a;对信息会其他资源的合法访问被无条件的组织 4. 非法使用&#x…

【数据结构】顺序表的动态分配(步骤代码详解)

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;数据结构 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进…

某盾滑块拼图验证码增强版

介绍 提示&#xff1a;文章仅供交流学习&#xff0c;严禁用于非法用途&#xff0c;如有不当可联系本人删除 最近某盾新推出了&#xff0c;滑块拼图验证码&#xff0c;如下图所示&#xff0c;这篇文章介绍怎么识别滑块距离相关。 参数attrs 通过GET请求获取的参数attrs, 决…

Python 与机器学习,在服务器使用过程中,常用的 Linux 命令包括哪些?

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 本博客旨在分享在实际开发过程中&#xff0c;开发者需要了解并熟练运用的 Linux 操作系统常用命令。Linux 作为一种操作系统&#xff0c;与 Windows 或 MacOS 并驾齐驱&#xff0c;尤其在服务器和开发环…

时序分解 | Matlab实现GSWOA-VMD改进鲸鱼优化算法优化变分模态分解时间序列信号分解

时序分解 | Matlab实现GWO-CEEMDAN基于灰狼算法优化CEEMDAN时间序列信号分解 目录 时序分解 | Matlab实现GWO-CEEMDAN基于灰狼算法优化CEEMDAN时间序列信号分解效果一览基本介绍程序设计参考资料 效果一览 基本介绍 Matlab实现GSWOA-VMD改进鲸鱼优化算法优化变分模态分解时间序…

Flink总结

1.Flink如何保证Exactly-Once 使用checkpoint检查点&#xff0c;其实就是 所有任务的状态&#xff0c;在某个时间点的一份快照&#xff1b;这个时间点&#xff0c;应该是所有任务都恰好处理完一个相同 的输入数据的时候。 checkpoint的步骤&#xff1a; flink应用在启动的时候…

单元测试——Junit (断言、常用注解)

单元测试 Junit单元测试框架 使用 断言测试 使用Assert.assertEquals(message, 预期值, 实际值); 这段代码是用于在测试中验证某个方法的返回值是否符合预期。其中&#xff0c;"方法内部有bug"是用于在断言失败时显示的提示信息。4是预期的返回值&#xff0c;index…

买了云服务器不会用?教你使用京东云!

1. 前言 最近出现了许多云服务器的活动&#xff0c;由于活动期间优惠的价格、极高的性价比&#xff0c;因此&#xff0c;无论是企业&#xff0c;还是私人用户&#xff1b;无论是云服务器玩的溜的老手&#xff0c;还是新手小白都直接冲了起来&#xff01;但是对于一些还未使用过…

数字未来:探索 Web3 的革命性潜力

在当今数字化的时代&#xff0c;Web3作为互联网的新兴范式正逐渐崭露头角&#xff0c;引发了广泛的关注和探讨。本文将深入探索数字未来中Web3所蕴含的革命性潜力&#xff0c;探讨其对社会、经济和技术的深远影响。 1. Web3&#xff1a;数字世界的下一个阶段 Web3是一个正在崛…

AWS入门实践-S3对象存储的基本用法

AWS S3(Simple Storage Service)是亚马逊云服务提供的一种高度可扩展、安全且经济高效的对象存储服务。它允许用户在任何位置存储和检索任意数量的数据,非常适合存储和分发静态文件、备份数据以及作为数据湖的存储层。 一、S3上传和下载文件&#xff08;AWS门户&#xff09; …

Flink应用

1.免密登录 2.flink StandAlone模式 3.Flink Yarn 模式 (on per 模式,on session 模式) Flink概述 按照Apache官方的介绍&#xff0c;Flink是一个对有界和无界数据流进行状态计算的分布式处理引擎和框架。通俗地讲&#xff0c;Flink就是一个流计算框架&#xff0c;主要用来处…

Excel列匹配VLookUp功能使用

生活中很多关于excel多列数据进行匹配计算等场景,其中最常用的一个函数就是VLookUp了,下面直接上图: 得到结果如下: 得到结果如下: 注意: 1.在需要把计算完的数据粘贴到另一列或者另个sheet时,复制后,不要直接ctrlv粘贴,这样会把计算公式粘贴到对应的列.正确做法是:右键粘贴,选…