这是我参与「第五届青训营 」笔记创作活动的第7天
前言
在参与完成大项目之前,我首先学习了gin这一常用的http框架的基本使用
1.Gin介绍
Gin 是一个用 Go (Golang) 编写的 HTTP Web 框架。 它具有类似 Martini 的 API,但性能比 Martini 快 40 倍。
下载gin:
go get -u github.com/gin-gonic/gin
将gin引入到代码中:
import "github.com/gin-gonic/gin"
2.第一个gin网站 示例 以下展示一个最小的gin web程序
package main
import (
"github.com/gin-gonic/gin"
)
// hello 路径的函数
func sayHello(c *gin.Context) {
c.JSON(200, gin.H{
"message": "hello gin!",
}) // 返回一个JSON数据
}
func main() {
r := gin.Default() // 返回默认的路由引擎
// 指定用户使用GET请求访问/hello时,执行sayHello函数
r.GET("hello/", sayHello)
// 启动服务
r.Run()
}
启动程序之后,浏览器访问:
输出信息:
{"message":"hello gin!"} 1 RESTful API REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为“表征状态转移”或“表现层状态转化”。
简单来说,REST的含义就是客户端与Web服务器之间进行交互的时候,使用HTTP协议中的4个请求方法代表不同的动作。
-
GET用来获取资源
-
POST用来新建资源
-
PUT用来更新资源
-
DELETE用来删除资源。
只要API程序遵循了REST风格,那就可以称其为RESTful API。目前在前后端分离的架构中,前后端基本都是通过RESTful API来进行交互。
获取body内容值
package main
import (
"bytes"
"github.com/gin-gonic/gin"
"io/ioutil"
"net/http"
)
/**
获取body内容
*/
func main(){
r:=gin.Default()
r.POST("/test", func(context *gin.Context) {
//拿到body的字节内容
bodyByts,err:=ioutil.ReadAll(context.Request.Body)
if err != nil {
//如果抛异常则打印错误
context.String(http.StatusBadRequest,err.Error())
context.Abort()
}else{
/**
正确则输出正确内容
*/
context.Request.Body = ioutil.NopCloser(bytes.NewBuffer(bodyByts))
firstName:=context.PostForm("firstName")
lastName:=context.DefaultPostForm("lastName","default")
context.String(200,"%s,%s,%s",firstName,lastName,string(bodyByts))
}
})
r.Run()
}
获取get请求参数
package main
import "github.com/gin-gonic/gin"
func main(){
//声明gin实例
r:=gin.Default()
r.GET("/test", func(context *gin.Context) {
//获取第一个参数
firstName := context.Query("first_name")
//获取第二个参数,有默认值
lastName := context.DefaultQuery("last_name",
"last_default_name")
context.String(200,"%s,%s",firstName,lastName)
})
r.Run()
}
分组
什么是分组?
- 对 router 创建 Group 就是分组,同一分组会拥有同一前缀和同一中间件
如何创建路由组?
router := gin.Default()
// 简单的路由组: v1
v1 := router.Group("/v1")
{
v1.POST("/login", loginEndpoint)
v1.POST("/submit", submitEndpoint)
v1.POST("/read", readEndpoint)
}
// 简单的路由组: v2
v2 := router.Group("/v2")
{
v2.POST("/login", loginEndpoint)
v2.POST("/submit", submitEndpoint)
v2.POST("/read", readEndpoint)
}
为什么要分组?
- 让路由结构更加清晰,更加方便的管理路由
总结
gin使用起来十分简洁,开发高效,也支持中间件和模板渲染。