Gin
- Gin安装:go get github.com/gin-gonic/gin
- Gin使用gin.Default()/gin.New(){Defaultn内部调用的也是New())返回一个Engine指针只不过New()是不带Logger和Recovery中间件的,Engine是整个框架的一个实例
func Default() *Engine {
debugPrintWARNINGDefault()
engine := New()//调用gin.New()
engine.Use(Logger(), Recovery())//声明使用的中间件
return engine
}
func (group *RouterGroup) GET(relativePath string, handlers ...HandlerFunc) IRoutes {
return group.handle("GET", relativePath, handlers)//将请求路由交给RouterGroup.handle()
}
type RouterGroup struct {
Handlers HandlersChain//父节点路由监听
basePath string//相对于当前路径的上级路径
engine *Engine
root bool//判断当前是否为根
}
func (group *RouterGroup) handle(httpMethod, relativePath string, handlers HandlersChain) IRoutes {
absolutePath := group.calculateAbsolutePath(relativePath)
handlers = group.combineHandlers(handlers)
group.engine.addRoute(httpMethod, absolutePath, handlers)
return group.returnObj()
}
也可以为将中间件传入GET()中
关于Group()//gin中提供了路由组的支持,可以将不同的模块放到不同的分组目录下
func main() {
router := gin.Default()
// Simple group: v1
v1 := router.Group("/v1")
{
v1.POST("/login", loginEndpoint)
v1.POST("/submit", submitEndpoint)
v1.POST("/read", readEndpoint)
}
// Simple group: v2
v2 := router.Group("/v2")
{
v2.POST("/login", loginEndpoint)
v2.POST("/submit", submitEndpoint)
v2.POST("/read", readEndpoint)
}
router.Run(":8080")
}
gin请求解析
- gin中带参数的路由可以定义为 app.GET("/index/:name")这样的形式
- gin处理前端请求或者其它请求调用时需要解析对应的头部和body相关信息,在gin中分别使用如下字段和方法获取对应内容
- gin.Context下定义了Param方法和Params类型
type Param struct {
Key string
Value string
}
type Params []Param
func (c *Context) Param(key string) string {
return c.Params.ByName(key)
}//通过Param()方法可以获取请求头中的参数,但针对的是("PATH/:param")的形式
* 对于url中传参如http://127.0.0.1:8080/index?name=hades这样的参数解析就可以通过使用context.Query()和context.DefaultQuery()来获取
DefaultQuer相对于Query的区别主要在于前者接收两个参数一个key和一个默认value值,如果查询不到则赋默认值
* 表单中值的传递使用context.PostForm("username")获取表单提交的对应数据,表单数据也可以通过context.Requet.Form获取前提是执行了ParseForm将数据写入Form,同样的context中有一个DefaultPostForm()和DefaultQuery()是一样的赋默认值的用法
* json和其它的放在body中的数据可以通过Request.Form获取也可以使用ioutil.ReadAll(context.Request.Body)读取```
关于HandlerFunc是响应函数,接收一个*gin.Context参数,封装了相关的操作
gin中对静态页面的加载
- LoadHTMLGlob()或者LoadHTMLFiles():前者只需要将包含页面的目录传入后者则需指定特定的文件
app:=gin.New()
app.LoadHTMLGlob("template/")
//app.LoadHTMLFiles("template/index.html")
载入文件后在对应的handler函数中使用context.HTML()方法即可返回对应的页面
简单实例
package main
import (
"log"
"net/http"
"github.com/gin-gonic/gin"
)
func HomePage(context *gin.Context) {
context.HTML(http.StatusOK, "index.html", gin.H{}) //返回HTML页面
/*
context.String(http.StatusOK,"Welcome")
context.JSON(http.StatusOK,jsonData)//返回JSON
context.XML()//返回XML
context.YAML()//返回YAML
*/
}
func Default(context *gin.Context) {
name := context.Param("name")
sex := context.Params.ByName("sex")
log.Printf("name:%v,sex:%v\n", name, sex)
}
func PostInfo(context *gin.Context) {
context.Request.ParseForm()
log.Printf("name:%v\n", context.PostForm("name"))
log.Printf("id:%v\n", context.DefaultPostForm("id", "123456"))
log.Println("Body:", context.Request.Form)
log.Println("Query name:", context.Query("name")) //依赖于URL后面的参数
log.Println("Query info:", context.DefaultQuery("info", "vvvvery "))
}
func main() {
app := gin.Default() //注册实例
app.GET("/", HomePage)
app.GET("/default/:name", Default)
app.POST("/post", PostInfo)
app.LoadHTMLFiles("view/index.html") //添加HTML文件
app.Run(":8080")
}