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…

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

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

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

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

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

一、安全架构概述 常见信息威胁介绍&#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改进鲸鱼优化算法优化变分模态分解时间序…

单元测试——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; …

Excel列匹配VLookUp功能使用

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

游戏引擎架构01__引擎架构图

根据游戏引擎架构预设的引擎架构来构建运行时引擎架构 ​

数据库-root密码丢失的重置方案(win11环境)

当在windows系统中安装的mysql由于操作不当&#xff0c;或者密码遗忘&#xff0c;今天测试了一下&#xff0c;可以用以下方法重置root的密码。 mysqlwindows环境root密码重置问题 在win10/11环境下mysql8密码遗忘后的重置密码方案。 停止mysql服务 查找windows中的mysql服务名称…

springboot之RESTful接口与Swagger

一、RESTful GET获取资源、POST新建资源、PUT更新资源、DELETE删除资源。 RESTful两大特性 1、安全性&#xff1a;GET请求不会引起资源本身改变。 2、幂等性&#xff1a;对一个接口请求和多次请求返回的资源应该一致。 2xx&#xff1a;成功 4xx&#xff1a;客户端错误。 …

03 | Swoole 源码分析之 Http Server 模块

首发原文链接&#xff1a;Swoole 源码分析之 Http Server 模块 大家好&#xff0c;我是码农先森。 Http 模块的注册初始化 这次我们分析的就是 Swoole 官网的这段代码&#xff0c;看似简单&#xff0c;实则不简单。 在 Swoole 源码文件 swoole_http_server.c 中有这样一个函数…

gin源码分析(1)--初始化中间件,路由组与路由树

目标 关于gin.Default()&#xff0c;gin.New()&#xff0c;gin.Use()group与子group之间的关系&#xff0c;多group与middleware之间关系中间件的类型&#xff0c;全局&#xff0c;group&#xff0c;get&#xff0c;不同类型的中间件什么时候执行。中间件 next 和abort行为如何…

Go-Gin中优雅的实现参数校验,自定义错误消息提示

问题描述 在参数校验的时候我们一般会基于"github.com/go-playground/validator/v10"这个库给结构体加标签实现校验参数&#xff0c;当参数校验错误的时候&#xff0c;他的提示一般是英文的&#xff0c;怎么自定义参数错误提示呢&#xff1f;跟着我一步步来 注册校…