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

go框架gin的使用的更多相关文章

  1. Go语言web框架 gin

    Go语言web框架 GIN gin是go语言环境下的一个web框架, 它类似于Martini, 官方声称它比Martini有更好的性能, 比Martini快40倍, Ohhhh….看着不错的样子, 所 ...

  2. GO语言web框架Gin之完全指南

    GO语言web框架Gin之完全指南 作为一款企业级生产力的web框架,gin的优势是显而易见的,高性能,轻量级,易用的api,以及众多的使用者,都为这个框架注入了可靠的因素.截止目前为止,github ...

  3. Golang 微框架 Gin 简介

    框架一直是敏捷开发中的利器,能让开发者很快的上手并做出应用,甚至有的时候,脱离了框架,一些开发者都不会写程序了.成长总不会一蹴而就,从写出程序获取成就感,再到精通框架,快速构造应用,当这些方面都得心应 ...

  4. httprouter框架 (Gin使用的路由框架)

    之前在Gin中已经说到, Gin比Martini的效率高好多耶, 究其原因是因为使用了httprouter这个路由框架, httprouter的git地址是: httprouter源码. 今天稍微看了 ...

  5. Go组件学习——Web框架Gin

    以前学Java的时候,和Spring全家桶打好关系就行了,从Spring.Spring MVC到SpringBoot,一脉相承. 对于一个Web项目,使用Spring MVC,就可以基于MVC的思想开 ...

  6. gin框架教程一: go框架gin的基本使用

    我们在用http的时候一般都会用一些web框架来进行开发,gin就是这样的一个框架,它有哪些特点呢 一:gin特点 1.性能优秀2.基于官方的net/http的有限封装3.方便 灵活的中间件4.数据绑 ...

  7. GO语言web框架Gin之完全指南(二)

    这篇主要讲解自定义日志与数据验证 参数验证 我们知道,一个请求完全依赖前端的参数验证是不够的,需要前后端一起配合,才能万无一失,下面介绍一下,在Gin框架里面,怎么做接口参数验证的呢 gin 目前是使 ...

  8. GO语言web框架Gin之完全指南(一)

    作为一款企业级生产力的web框架,gin的优势是显而易见的,高性能,轻量级,易用的api,以及众多的使用者,都为这个框架注入了可靠的因素.截止目前为止,github上面已经有了 35,994 star ...

  9. go语言框架gin之集成swagger

    1.安装swag 在goLand中直接使用go get -u github.com/swaggo/swag/cmd/swag命令安装会报错 翻了很多博客,都没找到太合适的办法,根据博客中所写的操作还是 ...

随机推荐

  1. Python——tkinter操作

    一.创建单选框 form tkinter import * #创建窗口体 window = tk() #初始化组合件绑定 w1 = IntVar() #设置初始选择项1 w1.set(1) def O ...

  2. DFI LP DK P45 T2RS PLUS BIOS SETTING

    standard cmos features date (mm:dd:yy) mon,oct 11 2016 time (hh:mm:ss) 10 : 10 : 26 ide channel 0 sa ...

  3. 搭建Hexo博客(一)-创建Hexo环境

    Hexo配合github,可以创建自己的博客.基本原理是使用Hexo生成静态页面,发布到github上.在本地需要搭建Hexo环境. 1.安装nodejs 下载并安装NodeJS,官网地址:https ...

  4. Typora——安装Pandoc

    安装 打开typora,帮助-> Install and Use Pandoc  |  访问在线地址 https://support.typora.io/Install-and-Use-Pand ...

  5. HDU4864 Task(算竞进阶习题)

    贪心 比较巧妙的贪心..先把所有机器和任务按时间是第一关键字,等级为第二关键字排序. 然后用机器去匹配每一个任务. 排序之后,在时间上满足当前任务的机器,必定也在时间上满足后面的机器,所以我们每次把时 ...

  6. 【BZOJ1580】【USACO2009Hol】杀手游戏 计算几何

    题目描述 一个平面上有很多个点在运动.给你每个点的初始坐标和每个点的速度,求出最多有多少个点到\(0\)号店的距离同时不超过\(r\). \(n\leq 50000\) 题解 我们先把\(0\)号点平 ...

  7. 如何保证 spring-boot 和 spring-cloud版本一致

    spring-boot 版本 和 spring-cloud版本是一一对应的,很多错误都是由于版本不一致导致的.很多百度的东西太老了, 版本一升级就会出错. spring的jar包依赖关系是最难的,但聪 ...

  8. Day24-ModelForm操作及验证

    Day23内容回顾--缺失,遗憾成狗. 一:Model(2个功能) -数据库操作: -验证,只有一个clean方法可以作为钩子. 二:Form(专门来做验证的)--------根据form里面写的类, ...

  9. 用keras实现基本的文本分类任务

    数据集介绍 包含来自互联网电影数据库的50000条影评文本,对半拆分为训练集和测试集.训练集和测试集之间达成了平衡,意味着它们包含相同数量的正面和负面影评,每个样本都是一个整数数组,表示影评中的字词. ...

  10. 【BZOJ4868】[六省联考2017]期末考试(贪心)

    [BZOJ4868][六省联考2017]期末考试(贪心) 题面 BZOJ 洛谷 题解 显然最终的答案之和最后一个公布成绩的课程相关. 枚举最后一天的日期,那么维护一下前面有多少天可以向后移,后面总共需 ...