Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >初学gin

初学gin

作者头像
是小张啊喂
发布于 2021-08-09 09:40:47
发布于 2021-08-09 09:40:47
77700
代码可运行
举报
文章被收录于专栏:软件软件
运行总次数:0
代码可运行

已经放弃goframe框架,对待新手不是很友好,社区圈子也很小。因为我自身的话是没有go语言的编程基础的,所以导致了我看不太懂那个框架,不过看很多人都说goframe封装的很好,有人吐槽有人夸,开源的框架嘛,这些都是在所难免的。

放弃goframe不代表放弃go,当前go语言还是很强的,查了一下相关的资料,大部分都推荐gin框架开始学习,抱着怀疑入坑的心态,有一次开始了学习。

自己百度找到了一个中文文档,看起来还可以,http://www.topgoer.com/gin%E6%A1%86%E6%9E%B6/,废话不多说直接上手体验一下

gin路由

首先构建一下依赖

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
require github.com/gin-gonic/gin v1.6.3

基本路由

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func main() {
    r := gin.Default()
    r.GET("/", func(c *gin.Context) {
        c.String(http.StatusOK, "hello word")
    })
    r.POST("/xxxpost",getting)
    r.PUT("/xxxput")
    //监听端口默认为8080
    r.Run(":8000")
}

从这个官方的示例中,能看出下面几个问题:

  1. r直接支持请求方式的定义
  2. 支持自定义端口

也很简洁,我觉得相对于我之前学习的框架,这个确实要好理解很多

gin还支持Restful风格的API,参照java来说,那就好理解很多

API参数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func main() {
    r := gin.Default()
    r.GET("/user/:name/*action", func(c *gin.Context) {
        name := c.Param("name")
        action := c.Param("action")
        //截取/
        action = strings.Trim(action, "/")
        c.String(http.StatusOK, name+" is "+action)
    })
    //默认为监听8080端口
    r.Run(":8000")
}

如果我们直接访问

http://127.0.0.1:8000/user/ShaoJie/learning 页面上会输出ShaoJie is learning

gin可以直接获取API中的参数,这个还挺好理解的,Java里面的话,有点类似@PathVariable()注解,很强哈,这边还注意到,gin截取string类型所用的方法,strings.Trim()

URl参数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func main() {
    r := gin.Default()
    r.GET("/user", func(c *gin.Context) {
        //指定默认值
        //http://localhost:8080/user 才会打印出来默认的值
        name := c.DefaultQuery("name", "ShaoJie")
        c.String(http.StatusOK, fmt.Sprintf("hello %s", name))
    })
    r.Run()
}

访问 http://127.0.0.1:8000/user 页面上会输出hello ShaoJie 或者

访问 http://127.0.0.1:8080/user?name=Shao-Jie 页面上是 hello Shao-Jie

那也就是说,这里是有一个默认的取值的,如果没有接收到参数的话,这里直接输出定义的默认值

表单传参

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <form action="http://localhost:8080/form" method="post" action="application/x-www-form-urlencoded">
        用户名:<input type="text" name="username" placeholder="请输入你的用户名">  <br>&nbsp;&nbsp;&nbsp;码:<input type="password" name="userpassword" placeholder="请输入你的密码">  <br>
        <input type="submit" value="提交">
    </form>
</body>
</html>
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func main() {
    r := gin.Default()
    r.POST("/form", func(c *gin.Context) {
        types := c.DefaultPostForm("type", "post")
        username := c.PostForm("username")
        password := c.PostForm("userpassword")
        // c.String(http.StatusOK, fmt.Sprintf("username:%s,password:%s,type:%s", username, password, types))
        c.String(http.StatusOK, fmt.Sprintf("username:%s,password:%s,type:%s", username, password, types))
    })
    r.Run()
}

表单参数可以通过PostForm()方法获取 该方法默认解析的是x-www-form-urlencodedfrom-data格式的参数 ,这个例子其实很简单,我本来想直接用模板,但是看到这里,我好像还不太好实现这个问题,菜是原罪

routes group

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func main() {
   // 1.创建路由
   // 默认使用了2个中间件Logger(), Recovery()
   r := gin.Default()
   // 路由组1 ,处理GET请求
   v1 := r.Group("/v1")
   // {} 是书写规范
   {
      v1.GET("/login", login)
      v1.GET("submit", submit)
   }
   v2 := r.Group("/v2")
   {
      v2.POST("/login", login)
      v2.POST("/submit", submit)
   }
   r.Run(":8000")
}

这个可以对比goframe,相比较而言,我更喜欢现在这种(小声逼逼:那个框架差点给我心态整蹦了,初学者勿入坑)

路由拆分与注册

基本的路由注册

上面将路由写在一个main中都属于基本的路由注册

路由拆分成单独文件或包

将路由拆分,相当于在启动的时候加载这个函数

routers/routers.go

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func helloHandler(c *gin.Context) {
    c.JSON(http.StatusOK, gin.H{
        "message": "Hello www.topgoer.com!",
    })
}

func SetupRouter() *gin.Engine {
    r := gin.Default()
    r.GET("/topgoer", helloHandler)
    return r
}

main.go

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func main() {
    r := routers.SetupRouter()
    if err := r.Run(); err != nil {
        fmt.Println("startup service failed, err:%v\n", err)
    }
}

这个涉及到go的一个小知识点,那就是方法名称大小写的问题

1、 首字母小写,代表只对当前包内文件可见 类似java中的protected

2、 首字母大写,代表只对所有文件可见 类似java中的private

路由拆分成多个文件

routers/blog.go

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func LoadShop(e *gin.Engine)  {   e.GET("/helloblog", helloHandler)}

routers/shop.go

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func LoadBlog(e *gin.Engine)  {   e.GET("/helloshop", helloHandler)}

main.go

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func main() {
	r := gin.Default()
	routers.LoadBlog(r)
	routers.LoadShop(r)
	if err := r.Run(); err != nil {
		fmt.Println("startup service failed, err:%v\n", err)
	}
}

路由拆分到不同的APP

blog.goshop.go移动到app/blogapp/shop中,修改 routers/routers.go

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 注册app的路由配置
func Include(opts ...Option) {
    options = append(options, opts...)
}

// 初始化
func Init() *gin.Engine {
    r := gin.New()
    for _, opt := range options {
        opt(r)
    }
    return r
}

main.go

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func main() {
    // 加载多个APP的路由配置
    routers.Include(shop.Routers, blog.Routers)
    // 初始化路由
    r := routers.Init()
    if err := r.Run(); err != nil {
        fmt.Println("startup service failed, err:%v\n", err)
    }
}

gin数据解析和绑定

Json数据解析和绑定

文档示例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 定义接收数据的结构体
type Login struct {
   // binding:"required"修饰的字段,若接收为空值,则报错,是必须字段
   User    string `form:"username" json:"user" uri:"user" xml:"user" binding:"required"`
   Pssword string `form:"password" json:"password" uri:"password" xml:"password" binding:"required"`
}

func main() {
   // 1.创建路由
   // 默认使用了2个中间件Logger(), Recovery()
   r := gin.Default()
   // JSON绑定
   r.POST("loginJSON", func(c *gin.Context) {
      // 声明接收的变量
      var json Login
      // 将request的body中的数据,自动按照json格式解析到结构体
      if err := c.ShouldBindJSON(&json); err != nil {
         // 返回错误信息
         // gin.H封装了生成json数据的工具
         c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
         return
      }
      // 判断用户名密码是否正确
      if json.User != "root" || json.Pssword != "admin" {
         c.JSON(http.StatusBadRequest, gin.H{"status": "304"})
         return
      }
      c.JSON(http.StatusOK, gin.H{"status": "200"})
   })
   r.Run(":8000")
}

Postman测试一下 地址:http://127.0.0.1:8000/loginJSON Post请求

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
    "user":"root",
    "password":"admin"
}

表单的数据解析和绑定

文档示例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <form action="http://localhost:8000/loginForm" method="post" enctype="application/x-www-form-urlencoded">
        用户名<input type="text" name="username"><br>
        密码<input type="password" name="password">
        <input type="submit" value="提交">
    </form>
</body>
</html>
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 定义接收数据的结构体
type Login struct {
    // binding:"required"修饰的字段,若接收为空值,则报错,是必须字段
    User    string `form:"username" json:"user" uri:"user" xml:"user" binding:"required"`
    Pssword string `form:"password" json:"password" uri:"password" xml:"password" binding:"required"`
}

func main() {
    // 1.创建路由
    // 默认使用了2个中间件Logger(), Recovery()
    r := gin.Default()
    // JSON绑定
    r.POST("/loginForm", func(c *gin.Context) {
        // 声明接收的变量
        var form Login
        // Bind()默认解析并绑定form格式
        // 根据请求头中content-type自动推断
        if err := c.Bind(&form); err != nil {
            c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
            return
        }
        // 判断用户名密码是否正确
        if form.User != "root" || form.Pssword != "admin" {
            c.JSON(http.StatusBadRequest, gin.H{"status": "304"})
            return
        }
        c.JSON(http.StatusOK, gin.H{"status": "200"})
    })
    r.Run(":8000")
}

URl数据解析和绑定

文档示例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 定义接收数据的结构体
type Login struct {
    // binding:"required"修饰的字段,若接收为空值,则报错,是必须字段
    User    string `form:"username" json:"user" uri:"user" xml:"user" binding:"required"`
    Pssword string `form:"password" json:"password" uri:"password" xml:"password" binding:"required"`
}

func main() {
    // 1.创建路由
    // 默认使用了2个中间件Logger(), Recovery()
    r := gin.Default()
    // JSON绑定
    r.GET("/:user/:password", func(c *gin.Context) {
        // 声明接收的变量
        var login Login
        // Bind()默认解析并绑定form格式
        // 根据请求头中content-type自动推断
        if err := c.ShouldBindUri(&login); err != nil {
            c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
            return
        }
        // 判断用户名密码是否正确
        if login.User != "root" || login.Pssword != "admin" {
            c.JSON(http.StatusBadRequest, gin.H{"status": "304"})
            return
        }
        c.JSON(http.StatusOK, gin.H{"status": "200"})
    })
    r.Run(":8000")
}

总结一下这三种解析和绑定

  1. json解析和绑定对应了body传参
  2. 表单解析对应了我们一般的表单请求,一般在html里面会更多一点,现在大部分前端都是vue了,所以有些东西自然而然的会慢慢忘记
  3. URL解析对应了Restful API请求

那更新这一期的话,很明显能看出来,其实gin还是很简单的,基本上现在就可以写一点接口了,后面的话就不多叙述了,直接进入到这个深入学习了。

学习是一个漫长且煎熬的过程,但是我们还能在其中寻找乐趣的话,那肯定非常有意思。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-10-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
02 . Go框架之Gin框架从入门到熟悉(数据解析和绑定,渲染,重定向,同步异步,中间件)
json,结构体,xml, yaml类似于java的properties,protobuf
iginkgo18
2020/11/04
1.5K0
02 . Go框架之Gin框架从入门到熟悉(数据解析和绑定,渲染,重定向,同步异步,中间件)
Gin-Web-Framework官方指南中文(下篇)
ShouldBind,ShouldBindJSON,ShouldBindXML,ShouldBindQuery,ShouldBindYAML
小诚信驿站
2019/10/31
2.4K0
Gin-Web-Framework官方指南中文(下篇)
Gin简单明了的教程---上
注意: 如果直接从github拉取失败,可以尝试更换代理,重新设置GOPROXY为国内代理源,然后再次尝试
大忽悠爱学习
2022/08/23
2.1K0
Gin简单明了的教程---上
01 . Go框架之Gin框架从入门到熟悉(路由和上传文件)
路由方法有GET, POST, PUT, PATCH, DELETE 和 OPTIONS,还有Any,可匹配以上任意类型的请求
iginkgo18
2020/10/30
1.5K0
go : gin 模型绑定与验证
将请求体绑定到类型中,请使用模型绑定。我们目前支持JSON、XML、YAML和标准表单值(foo=bar&boo=baz)的绑定
IT工作者
2022/07/23
3110
gin学习笔记
首先我们使用 go moudle来管理依赖, go版本要求在 1.11.1 及以上
用户2825413
2020/02/20
8120
从零开发区块链应用(七)--gin框架参数获取
本文作者:杰哥的技术杂货铺[1] 一、获取 query 参数 query 指的是 URL ? 后面携带的参数,例如 user/info?username=张三&password=123。获取请求的 q
Tiny熊
2022/02/22
1.1K0
从零开发区块链应用(七)--gin框架参数获取
漏洞挖掘之从开发者视角解析Gin框架中的逻辑漏洞与越权问题
以go的gin后端框架为例子,详细剖析了各种逻辑越权漏洞的成因已经对应防范手段,也为白帽子提供挖掘思路
亿人安全
2025/04/03
1520
漏洞挖掘之从开发者视角解析Gin框架中的逻辑漏洞与越权问题
Gin 路由注册与请求参数获取
RESTful(Representational State Transfer)代表的是一种基于HTTP协议设计的软件架构风格,它通常用于构建Web服务,是Representational State Transfer的简称,中文翻译为“表征状态转移”或“表现层状态转化”。RESTful架构的设计理念是将资源表示为URI(统一资源标识符),通过HTTP协议的GET、POST、PUT、DELETE等方法对资源进行操作。以下是RESTful架构的一些关键特点:
贾维斯Echo
2024/01/05
4440
Gin 路由注册与请求参数获取
Go: Gin框架中的binding验证器使用指南
在Gin框架中,数据绑定和验证是开发API时不可或缺的部分。Gin提供了强大的binding功能,允许我们将请求的数据绑定到结构体,并通过标签进行数据验证。本文将详细讲解如何在Gin中使用binding验证器进行数据验证,并提供代码示例帮助理解。
运维开发王义杰
2024/05/31
1.3K0
Go: Gin框架中的binding验证器使用指南
Gin 框架怎么使用自定义验证器?
阅读上面这段代码,我们定义一个 validator.Func 类型的函数变量,参数入参的类型是 validator.FieldLevel,返回结果是一个 bool 类型的变量。
frank.
2024/11/19
1470
Gin 框架怎么使用自定义验证器?
你会高效写http服务器吗?Gin实战演练
胖sir开始捣鼓http服务器,在寻求一种高效的解决方式且高性能的解决方式...
阿兵云原生
2023/02/16
2.1K0
Go语言(十三)Gin Web框架
Gin Web框架 简介 基于httprouter开发的web框架:https://github.com/gin-gonic/gin 提供Martini风格的API,但比Martini要快40倍 非常轻量级,使用简洁 Gin框架的安装与使用 安装: go get -u github.com/gin-gonic/gin 基本使用 import "github.com/gin-gonic/gin" func main() { r := gin.Default() r.GET("/ping", fu
alexhuiwang
2020/09/24
9050
Go语言(十三)Gin Web框架
Go:web框架 Gin 简介与实践
gin是用go语言开发的一个web框架,简单易用,是一个轻量级框架。Gin是Golang的一个web框架,封装优雅API友好,源码注释比较明确。借助Gin框架开发web服务,不仅可以省去很多常用的封装带来的时间,也有助于团队的编码风格和形成规范。
Freedom123
2024/03/29
6140
Go:web框架 Gin 简介与实践
6.Gin 路由详解 - GET POST 请求以及参数获取示例
为了能够更方便的获取请求相关参数,提高开发效率,我们可以基于请求的 Content-Type 识别请求数据类型并利用反射机制自动提取请求中 QueryString、form 表单、JSON、XML 等参数到结构体中。
Devops海洋的渔夫
2023/11/20
2.3K0
6.Gin 路由详解 - GET POST 请求以及参数获取示例
优化gin表单的错误提示信息
创建一个简单的登录例子,我们对username和password绑定了required标签,代表着请求login接口的参数中必须包含这两个字段。
编程黑洞
2023/03/06
1K0
Gin框架源码解析【建议收藏】
Gin框架是golang的一个常用的web框架,最近一个项目中需要使用到它,所以对这个框架进行了学习。gin包非常短小精悍,不过主要包含的路由,中间件,日志都有了。我们可以追着代码思考下,这个框架是如何一步一步过来的。
码农编程进阶笔记
2021/12/15
2.4K0
Gin框架源码解析【建议收藏】
go语言中gin的用法
在这个示例中,我们使用了gin框架来创建一个简单的HTTP服务。我们定义了四个路由:
周辰晨
2024/03/18
2040
Go web 开发框架 - Gin 简述
Gin 的英文意思是 杜松子酒,在它的官方介绍中提到了它的API 风格是 和 martini 相像的( martini-like )。而 martini 也是一个web框架,有意思的是 martini 的英文是 “马提尼”,也是一种鸡尾酒。
张云飞Vir
2020/04/16
2.5K0
Go web 开发框架 - Gin 简述
Gin 如何编写一个接收文件的 HTTP 接口
以前遇到编程类的问题,第一时间想到的是 Google,而现在我会问 ChatGPT。
恋喵大鲤鱼
2023/02/23
1.4K0
相关推荐
02 . Go框架之Gin框架从入门到熟悉(数据解析和绑定,渲染,重定向,同步异步,中间件)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验