gin框架基本使用

news/2023/6/6 4:08:24

目录

  • 前言
  • gin的基本使用
    • 1 创建项目,用于项目管理 go mod
    • 2 下载安装gin(前提是电脑已经安装了git)
      • gin示例
    • 3 Gin渲染(返回给前端的数据)
      • 3.1 返回html
      • 3.2 加载静态资源
      • 3.3 返回json格式数据
    • 4 获取请求参数
    • 4.1 获取path参数
      • 4.2 ShouldBind()参数绑定,获取json,form,路径参数
    • 5 重定向
      • 5.1 http重定向
      • 5.2 路由重定向
      • 5.3 gin路由
        • 普通路由
        • 路由组

前言

在go的web项目中,gin相当于java中的springmvc、gorm相当于java中的mybatis、gomod相当于java中的maven。
gin的中文文档

gin的基本使用

1 创建项目,用于项目管理 go mod

我们新建一个文件夹,在当前文件夹下打开cmd,输入共go mod (默认项目名为文件夹名,也可以自己指定项目名)
go mod后会在当前目录下生成go.mod文件,记录项目所下载的外部依赖(这个就相当于java中maven项目中pom文件)

2 下载安装gin(前提是电脑已经安装了git)

电脑安装配置git(已安装,直接忽略)

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

gin示例

package mainimport (
// 引入gin包"github.com/gin-gonic/gin"
)func main() {// 创建一个默认的路由引擎r := gin.Default()// GET:请求方式;/hello:请求的路径// 当客户端以GET方法请求/hello路径时,会执行后面的匿名函数r.GET("/hello", func(c *gin.Context) {// c.JSON:返回JSON格式的数据给客户端c.JSON(200, gin.H{  // 状态码200 和 map类型数据"message": "Hello world!",})})// 启动HTTP服务,默认在0.0.0.0:8080启动服务r.Run()
}

将上面的代码保存并编译执行,然后使用浏览器打开localhost:8080/hello就能看到一串JSON字符串"message": “Hello world!”。

Gin支持RESTful API的开发

func main() {r := gin.Default()r.GET("/hello", func(c *gin.Context) {c.JSON(200, gin.H{"message": "GET",})})r.POST("/hello", func(c *gin.Context) {c.JSON(200, gin.H{"message": "POST",})})r.PUT("/hello", func(c *gin.Context) {c.JSON(200, gin.H{"message": "PUT",})})r.DELETE("/hello", func(c *gin.Context) {c.JSON(200, gin.H{"message": "DELETE",})})
}

3 Gin渲染(返回给前端的数据)

3.1 返回html

我们在项目中新建文件夹static,用于保存静态资源
然后把我们自定义的html文件放在static文件夹下(我这里叫hello.html)

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><h1>66666666666666666</h1>
</body>
</html>

Gin框架中使用LoadHTMLGlob()或者LoadHTMLFiles()方法进行HTML模板渲染。

func main() {// 加载默认引擎r := gin.Default()// 访问static下的所有文件r.LoadHTMLGlob("static/*")// 访问static下的单个文件//r.LoadHTMLFiles("static/hello.html")r.GET("/hello", func(c *gin.Context) {// 把hello.html返回给前端,并附带title信息c.HTML(http.StatusOK, "hello.html", gin.H{"title": "hello",})})// 运行在本机8080端口r.Run(":8080")
}

打开浏览器访问localhost:8080/hello,就可以看到html了

3.2 加载静态资源

如果我们的html文件有引入外部静态资源的请求,就需要用到Static函数了
例如

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>// 引入css文件 请求为“/css/index.css”<link rel="stylesheet" href="/css/index.css">
</head>
<body><h1>66666666666666666</h1>
</body>
</html>

我们需要在static目录下新建css文件index.css

修改go文件

func main() {// 加载默认引擎r := gin.Default()// 加载静态文件  (接收/css请求,让请求去static目录下找index.css文件)r.Static("/css","./static")// 访问static下的所有文件r.LoadHTMLGlob("static/*")// 访问static下的单个文件//r.LoadHTMLFiles("static/hello.html")r.GET("/hello", func(c *gin.Context) {// 把hello.html返回给前端,并附带title信息c.HTML(http.StatusOK, "hello.html", gin.H{"title": "hello",})})// 运行在本机8080端口r.Run(":8080")
}

浏览器访问,然后我们就可以看到带有css样式的html页面了

3.3 返回json格式数据

func main() {r := gin.Default()// gin.H 是map[string]interface{}的缩写 map键是string格式,值是任意格式r.GET("/someJSON", func(c *gin.Context) {// 方式一:自己拼接JSONc.JSON(http.StatusOK, gin.H{"message": "Hello world!"})})r.GET("/moreJSON", func(c *gin.Context) {// 方法二:使用结构体var msg struct {Name    string `json:"user"` //使用标签 返回的数据Name修改为userMessage stringAge     int}msg.Name = "小王"msg.Message = "Hello world!"msg.Age = 18c.JSON(http.StatusOK, msg)})r.Run(":8080")
}

打开浏览器访问就可以看到{ “user”:“小王”,“Message”:“Hello world!”,“Age”:18}

4 获取请求参数

4.1 获取path参数

请求的参数通过URL路径传递,例如:/user/search/王/shanghai。 获取请求URL路径中的参数的方式如下。

func main() {//Default返回一个默认的路由引擎r := gin.Default()r.GET("/user/search/:username/:address", func(c *gin.Context) {username := c.Param("username")address := c.Param("address")//输出json结果给调用方c.JSON(http.StatusOK, gin.H{"message":  "ok","username": username,"address":  address,})})r.Run(":8080")
}

4.2 ShouldBind()参数绑定,获取json,form,路径参数

为了能够更方便的获取请求相关参数,提高开发效率,gin基于请求的Content-Type识别请求数据类型并利用反射机制自动提取请求中QueryString、form表单、JSON、XML等参数到结构体中。.ShouldBind()能够基于请求自动提取JSON、form表单和QueryString类型的数据,并把值绑定到指定的结构体对象。


type Login struct {// 使用标签  如果是form请求,把User改为user,json请求改为user,是否必须User     string `form:"user" json:"user" binding:"required"`Password string `form:"password" json:"password" binding:"required"`
}func main() {router := gin.Default()// 绑定JSON的示例 ({"user": "go", "pass": "123456"})router.POST("/loginJSON", func(c *gin.Context) {var login Loginif err := c.ShouldBind(&login); err == nil {fmt.Printf("login info:%#v\n", login)c.JSON(http.StatusOK, gin.H{"user":     login.User,"pass": login.Password,})} else {c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})}})// 绑定form表单示例 (user=go&pass=123456)router.POST("/loginForm", func(c *gin.Context) {var login Login// ShouldBind()会根据请求的Content-Type自行选择绑定器if err := c.ShouldBind(&login); err == nil {c.JSON(http.StatusOK, gin.H{"user":     login.User,"pass": login.Password,})} else {c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})}})// 绑定QueryString示例 (/login?user=go&pass=123456)router.GET("/loginForm", func(c *gin.Context) {var login Login// ShouldBind()会根据请求的Content-Type自行选择绑定器if err := c.ShouldBind(&login); err == nil {c.JSON(http.StatusOK, gin.H{"user":     login.User,"pass": login.Password,})} else {c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})}})router.Run(":8080")
}

ShouldBind会按照下面的顺序解析请求中的数据完成绑定:

  1. 如果是 GET 请求,只使用 Form 绑定引擎(query)。
  2. 如果是 POST 请求,首先检查 content-type 是否为 JSON 或 XML,然后再使用 Form(form-data)。

5 重定向

5.1 http重定向

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

5.2 路由重定向

r.GET("/hello", func(c *gin.Context) {// 指定重定向的URLc.Request.URL.Path = "/hello2"r.HandleContext(c)
})
r.GET("/hello2", func(c *gin.Context) {c.JSON(http.StatusOK, gin.H{"hello": "world"})
})

5.3 gin路由

普通路由

r.GET("/index", func(c *gin.Context) {...})
r.GET("/login", func(c *gin.Context) {...})
r.POST("/login", func(c *gin.Context) {...})

一个可以匹配所有请求方法的Any方法如下:

r.Any("/test", func(c *gin.Context) {...})

为没有配置处理函数的路由添加处理程序,默认情况下它返回404代码,下面的代码为没有匹配到路由的请求都返回404.html页面。

r.NoRoute(func(c *gin.Context) {c.HTML(http.StatusNotFound, "404.html", nil)})

路由组

我们可以将拥有共同URL前缀的路由划分为一个路由组。习惯性一对{}包裹同组的路由,

func main() {r := gin.Default()userGroup := r.Group("/user"){userGroup.GET("/index", func(c *gin.Context) {...})userGroup.GET("/login", func(c *gin.Context) {...})userGroup.POST("/login", func(c *gin.Context) {...})}shopGroup := r.Group("/shop"){shopGroup.GET("/index", func(c *gin.Context) {...})shopGroup.GET("/cart", func(c *gin.Context) {...})shopGroup.POST("/checkout", func(c *gin.Context) {...})}r.Run()
}

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

如若内容造成侵权/违法违规/事实不符,请联系郑州代理记账网进行投诉反馈,一经查实,立即删除!

相关文章

27岁的张一鸣是如何逆袭的?自观、识人、沟通的艺术

延迟满足感本质是克服人性弱点&#xff0c;而克服弱点&#xff0c;是为了更多的自由。 来 源 | 和牛商业&#xff08;ID&#xff1a;heniucaijing&#xff09; 作 者 | 黄彩霞 编 辑 | 牛叔 2006年&#xff0c;23岁的张一鸣还是高中生模样&#xff0c;相貌腼腆&#xff0c;话…

深信服android面试题,2017年深信服Android开发岗位笔试面试总结

笔试结构体、联合体、正则表达式、后缀表达式堆排序、霍夫曼树、链表的冒泡排序、字符串匹配、图的搜索笔试题目比较多&#xff0c;难度也比较大&#xff0c;总分100分&#xff0c;但是应该只需要考到30分就可以通过笔试。面试1、Activity的生命周期API中给出的activity的生命周…

Redis 7.0 新特性 :共享复制缓存区与MPAOF

00 前情提要 截止至2022年3月22号&#xff0c;稳定的Redis版本依然是Redis 6.x&#xff08;截止发稿日当天&#xff0c;最稳定版本是Redis 6.2.6&#xff09;。 提及Redis 6.0&#xff0c; 相比于Redis 5.x以及之前版本&#xff0c;Redis 6.0最大的改进就是在网络IO上使用了多线…

蓝桥杯--快排+队列+尺取法

&#x1f603;这只松鼠如约而至 - 许嵩 - 单曲 - 网易云音乐 &#x1f603;你买菜吗玫瑰 - 要不要买菜 - 单曲 - 网易云音乐 &#x1f603;一起玩吧这世界那么多人&#xff08;电影《我要我们在一起》主题曲&#xff09; - 莫文蔚 - 单曲 - 网易云音乐 前言 这是我在CSD…

你是正常的傻瓜吗

做个理智的人在心理学经典著作《影响力》中&#xff0c;作者西奥迪尼提过一个观点&#xff1a;“人就像录音机一样&#xff0c;一按按钮就播放。人是智慧生物通过理性做出各种独立的选择&#xff0c;怎么会像录音机一样机械地做出反应呢&#xff1f;然而在日常的工作和生活中&a…

不知不觉,我已经在C站创作四周年了

目录 一、写博客的初衷 二、写博客的好处 1、检验自己学习成果&#xff0c;加深对技术的理解 2、提高文字的表达能力 3、结交更多优秀的人&#xff0c;获得更多内推机会 4、打造个人品牌&#xff0c;提高业内影响力 5、得到报酬&#xff08;稿费/打赏/广告费等&#xff…

Pycharm2018激活注册码(有效期至2019.05)python

因为我的是Windows&#xff0c;所以这篇文章只针对Windows系统。 1、将“0.0.0.0 account.jetbrains.com”中的内容添加到hosts文件中&#xff0c;hosts路径为&#xff1a;C:\Windows\System32\drivers\etc 2、打开http://idea.lanyus.com/ &#xff0c;点击激活&#xff0c…