Golang Web框架之Gin

本文介绍了Gin,一个Golang的Web框架。详细讲解了如何安装Gin,使用gin.Default()和gin.New()创建引擎,以及如何定义GET请求路由。文章还提到了Gin的路由组功能,参数路由的定义,以及如何解析请求中的头部和body信息。此外,还讨论了Gin处理静态页面的方法,包括LoadHTMLGlob()和LoadHTMLFiles(),并提供了一个简单的实例展示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
}
  • gin中的GET方法定义GET请求路由及其响应
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")
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值