Gin 是一个用 Go (Golang) 编写的 Web 框架。 它具有类似 martini 的 API,性能要好得多,多亏了 httprouter,速度提高了 40 倍。 如果您需要性能和良好的生产力,您一定会喜欢 Gin。笔记参考官网,推荐大家去学习。
快速入门
安装
- 下载并安装gin
go get -u github.com/gin-gonic/gin
- 将gin引入到代码中
import "github.com/gin-gonic/gin"
开始
示例:
package main
import "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 上启动服务
}
此时就完成了一个简单的后台程序。
常用示例
RESTful API
首先REST是一种软件架构风格,简单来说,就是用HTTP协议的不同请求代表不同的操作。
- GET请求代表获取资源
- POST请求代表新增资源
- PUT请求代表更新或修改资源
- DELETE请求代表删除资源
只要你的API程序遵守了这个规则,那么就可以成为RESTful API。
目前RESTful API在前后端分离结构中大量的使用。
Gin框架支持RESTful API开发
func main(){
r:= gin.Default()
r.GET("/request",func(c *gin.Context){
c.JSON(200,gin.H{
"message":"GET",
})
})
r.POST("/request",func(c *gin.Context){
c.JSON(200,gin.H{
"message":"POST",
})
})
r.PUT("/request",func(c *gin.Context){
c.JSON(200,gin.H{
"message":"PUT",
})
})
r.DELETE("/request",func(c *gin.Context){
c.JSON(200,gin.H{
"message":"DELETE",
})
})
}
获取参数
获取querystring参数
也就是URL中?后面的参数
func main() {
r := gin.Default()
//请求如下:/user?username=小明&address=学校
r.GET("/user", func(c *gin.Context) {
//无值时,会给个默认值
username := c.DefaultQuery("username", "小明")
//username := c.Query("username")
address := c.Query("address")
//输出json结果给调用方
c.JSON(http.StatusOK, gin.H{
"message": "ok",
"username": username,
"address": address,
})
})
r.Run()
}
获取form表单参数
func main() {
r := gin.Default()
r.POST("/user", func(c *gin.Context) {
// DefaultPostForm取不到值时会返回指定的默认值
//username := c.DefaultPostForm("username", "小明")
username := c.PostForm("username")
address := c.PostForm("address")
//输出json结果给调用方
c.JSON(http.StatusOK, gin.H{
"message": "ok",
"username": username,
"address": address,
})
})
r.Run(":8080")
}
获取JSON参数
r.POST("/json", func(c *gin.Context) {
b, _ := c.GetRawData() // 从c.Request.Body读取请求数据
// 定义map或结构体
var m map[string]interface{}
// 反序列化
_ = json.Unmarshal(b, &m)
c.JSON(http.StatusOK, m)
})
获取path参数
func main() {
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")
}
参数绑定
// Binding from JSON
type Login struct {
User string `form:"user" json:"user" binding:"required"`
Password string `form:"password" json:"password" binding:"required"`
}
func main() {
r := gin.Default()
// 绑定JSON的示例
r.POST("/loginJSON", func(c *gin.Context) {
var login Login
if err := c.ShouldBind(&login); err == nil {
fmt.Printf("login info:%#v\n", login)
c.JSON(http.StatusOK, gin.H{
"user": login.User,
"password": login.Password,
})
} else {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
}
})
// 绑定form表单示例
r.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,
"password": login.Password,
})
} else {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
}
})
// 绑定QueryString示例
r.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,
"password": login.Password,
})
} else {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
}
})
// Listen and serve on 0.0.0.0:8080
router.Run(":8080")
}