gin框架教程一: go框架gin的基本使用
gin框架教程代码地址:
我们在用http的时候一般都会用一些web框架来进行开发,gin就是这样的一个框架,它有哪些特点呢
一:gin特点
1、性能优秀
2、基于官方的net/http的有限封装
3、方便 灵活的中间件
4、数据绑定很强大
5、社区比较活跃
等等
二:gin的安装
安装:
go get github.com/gin-gonic/gin
如果要更新:
go get -u github.com/gin-gonic/gin
三:gin的使用
1、入门的第一个示例
先来写出一个例子:example1.go
package main import (
"github.com/gin-gonic/gin"
) func main() {
r := gin.Default()
r.GET("/ping", func(c *gin.Context) {
c.JSON(, gin.H{
"message": "pong",
})
})
r.Run() //listen and serve on 0.0.0.0:8080
}
a. 然后运行 go run example1.go 之后,
b. 在浏览器上输入:http://localhost:8080/ping
输出结果:
{"message":"pong"}
2: gin的基本路由
// 创建带有默认中间件的路由:
r := gin.Default()
//创建不带中间件的路由:
//r := gin.New()
r.GET("/someGet", getting)
r.POST("/somePost", posting)
r.PUT("/somePut", putting)
r.DELETE("/someDelete", deleting)
r.PATCH("/somePatch", patching)
r.HEAD("/someHead", head)
r.OPTIONS("/someOptions", options)
3、获取路由的参数
3.1 Parameters in path
编写param1.go文件
package main import (
"github.com/gin-gonic/gin"
"net/http"
) func main() {
r := gin.Default() //这个能匹配 /user/tom , 但是不能匹配 /user/ 或 /user
r.GET("/user/:name", func(c *gin.Context) {
name := c.Param("name")
c.String(http.StatusOK, "Hello %s", name)
}) //有一个方法可以匹配 /user/tom, 也可以匹配 /user/tom/send
//如果没有任何了路由匹配 /user/tom, 它将会跳转到 /user/tom/
r.GET("/user/:name/*action", func(c *gin.Context) {
name := c.Param("name")
action := c.Param("action")
message := name + " is " + action
c.String(http.StatusOK, message)
}) r.Run(":8080")
}
a. 然后运行 go run param1.go 之后,
b. 在浏览器上输入:http://localhost:8080/user/tom
输出结果:Hello tom
c. 在浏览器上输入:http://localhost:8080/user/tom/
输出结果:tom is /
d. 在浏览器上输入:http://localhost:8080/user/tom/pig
输出结构: tom is /pig
3.2 query param
一般匹配这种形式的url /welcome?firstname=Jane&lastname=Doe
package main //Querystring parameters import (
"github.com/gin-gonic/gin"
"net/http"
) func main() {
r := gin.Default()
r.GET("/welcome", func(c *gin.Context) {
firstname := c.DefaultQuery("firstname", "Guest") //如果没有值,还可以给一个默认值
lastname := c.Query("lastname")
c.String(http.StatusOK, "Hello %s %s ", firstname, lastname)
})
r.Run(":8080")
}
a. 然后运行 go run param2.go 之后,
b. 在浏览器上输入:http://localhost:8080/welcome?lastname=jimmy
输出结果:Hello Guest jimmy
c. 在浏览器上输入:http://localhost:8080/welcome?lastname=jimmy&firstname=tom
输出结果:Hello tom jimmy
3.3 表单参数 Form
Multipart/Urlencoded Form
package main import (
"github.com/gin-gonic/gin"
// "net/http"
) func main() {
r := gin.Default()
r.POST("/form_post", func(c *gin.Context) {
message := c.PostForm("message")
nick := c.DefaultPostForm("nick", "guest") c.JSON(, gin.H{
"status": "posted",
"message": message,
"nick": nick,
})
}) r.Run(":8080")
}
可以用postman来测试一下, 测试结果如下:

3.4 混合型的query + post form
package main import (
// "fmt"
"github.com/gin-gonic/gin"
) /*
POST /post?id=1234&page=1 HTTP/1.1
Content-Type: application/x-www-form-urlencoded name=manu&message=this_is_great
*/
func main() {
r := gin.Default()
r.POST("/post", func(c *gin.Context) {
id := c.Query("id")
page := c.DefaultQuery("page", "")
name := c.PostForm("name")
message := c.PostForm("message") // fmt.Printf("id: %s; page: %s; name: %s; message: %s", id, page, name, message)
c.JSON(, gin.H{
"id": id,
"page": page,
"name": name,
"message": message,
})
}) r.Run(":8080")
}
用postman测试结果如下:

4:解析数据绑定
我们可以给一个请求的数据绑定到一个类型,gin支持绑定的类型有JSON,XML和标准的表单数据(foo=bar&boo=baz)。 注意绑定时需要设置绑定类型的标签。比如绑定json数据时,
设置 json:"fieldname"
package main import (
"github.com/gin-gonic/gin"
"net/http"
) // Binding from JSON
type User struct {
Username string `form:"username" json:"username" binding:"required"`
Password string `form:"password" json:"password" binding:"required"`
Age int `form:"age" json:"age"`
} func main() {
r := gin.Default()
// Example for binding JSON ({"username": "manu", "password": "123"})
r.POST("/loginJSON", func(c *gin.Context) {
var json User if err := c.ShouldBindJSON(&json); err == nil {
if json.Username == "manu" && json.Password == "" {
c.JSON(http.StatusOK, gin.H{"status": "you are logged in"})
} else {
c.JSON(http.StatusUnauthorized, gin.H{"status": "unauthorized", "username": json.Username, "pass": json.Password})
}
} else {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
}
})
// Example for binding a HTML form (user=manu&password=123)
r.POST("/loginForm", func(c *gin.Context) {
var form User
if err := c.ShouldBind(&form); err != nil {
if form.Username == "manu" && form.Password == "" {
c.JSON(http.StatusOK, gin.H{"status": "you are logged in 2"})
} else {
c.JSON(http.StatusUnauthorized, gin.H{"status": "unauthorized 2"})
}
} else {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
}
})
r.Run(":8080")
}
还有一些其他的应用,可以参考:
https://github.com/gin-gonic/gin/blob/master/README.md
gin框架教程一: go框架gin的基本使用的更多相关文章
- HealthKit开发快速入门教程之HealthKit框架体系创建健康AppID
HealthKit开发快速入门教程之HealthKit框架体系创建健康AppID HealthKit开发准备工作 在开发一款HealthKit应用程序时,首先需要讲解HealthKit中有哪些类,在i ...
- revel框架教程之CSRF(跨站请求伪造)保护
revel框架教程之CSRF(跨站请求伪造)保护 CSRF是什么?请看这篇博文“浅谈CSRF攻击方式”,说的非常清楚. 现在做网站敢不防CSRF的我猜只有两种情况,一是没什么人访问,二是局域网应用.山 ...
- Kail Linux渗透测试教程之Recon-NG框架
Kail Linux渗透测试教程之Recon-NG框架 信息收集 信息收集是网络攻击最重要的阶段之一.要想进行渗透攻击,就需要收集目标的各类信息.收集到的信息越多,攻击成功的概率也就越大.本章将介绍信 ...
- CRL快速开发框架系列教程一(Code First数据表不需再关心)
本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...
- Cobalt Strike使用教程一
Cobalt Strike使用教程一 0x00 简介 Cobalt Strike是一款基于java的渗透测试神器,常被业界人称为CS神器.自3.0以后已经不在使用Metasploit框架而作为 ...
- gin源码解读2-揭开gin的神秘面纱
数据如何在gin中流转 func main() { gin.SetMode(gin.DebugMode) // 设置为开发模式 router := gin.Default() _ = router.S ...
- [转]Android中Xposed框架篇—利用Xposed框架实现拦截系统方法
一.前言 关于Xposed框架相信大家应该不陌生了,他是Android中Hook技术的一个著名的框架,还有一个框架是CydiaSubstrate,但是这个框架是收费的,而且个人觉得不怎么好用,而Xpo ...
- Linux驱动框架之framebuffer驱动框架
1.什么是framebuffer? (1)framebuffer帧缓冲(一屏幕数据)(简称fb)是linux内核中虚拟出的一个设备,framebuffer向应用层提供一个统一标准接口的显示设备.帧缓冲 ...
- [转载] Android中Xposed框架篇---利用Xposed框架实现拦截系统方法
本文转载自: http://www.wjdiankong.cn/android%E4%B8%ADxposed%E6%A1%86%E6%9E%B6%E7%AF%87-%E5%88%A9%E7%94%A8 ...
随机推荐
- 对vue-router的研究--------------引用
pushState/replaceState/popstate 解析 HTML5提供了对history栈中内容的操作.通过history.pushState/replaceState实现添加地址到hi ...
- windows10禁止系统更新
- sql 导入文件
zai SQLQuery4.sql 文件中 --BULK INSERT Table_1 from 'D:\aaaa#azzz.txt' with(fieldterminator=',',rowterm ...
- ueditor+实现word图片自动上传
最近公司做项目需要实现一个功能,在网页富文本编辑器中实现粘贴Word图文的功能. 我们在网站中使用的Web编辑器比较多,都是根据用户需求来选择的.目前还没有固定哪一个编辑器 有时候用的是UEditor ...
- 文件选择对话框:CFileDialog
程序如下: CString FilePathName; //文件名参数定义 CFileDialog Dlg(TRUE,NULL,NULL, ...
- cogs2039树的统计 x
2039. 树的统计 ★★ 输入文件:counttree.in 输出文件:counttree.out 简单对比 时间限制:1 s 内存限制:128 MB [题目描述] 关于树的统计问题 ...
- 【IOI2018】组合动作
还是自己水平不够,想了两天没想出来--(然后我就被其他人吊打了) 这种题目看了题解就秒会,自己想就想不出来-- 下面是我的心路历程(我就在想出来又叉掉的不断循环中度过--) 开始把题目看成了查询限制 ...
- XFF和referer
XFF构造来源IP Refer构造来源浏览器
- Authing新功能——小程序扫码登录
近期,Authing 发布了新功能--小程序扫码登录. 小程序扫码登录指使用Authing小程序身份管家在网页端或其它客户端执行微信登录,目前的SDK仅支持客户端JavaScript.其它语言若想使用 ...
- JavaScript Thread.Sleep()
What is the JavaScript version of sleep()? Since 2009 when this question was asked, JavaScript has e ...