gin 网络请求与路由处理
我们介绍了Gin框架,并做了Gin框架的安装,完成了第一个Gin工程的创建。
创建Engine
在gin框架中,Engine被定义成为一个结构体,Engine代表gin框架的一个结构体定义,其中包含了路由组、中间件、页面渲染接口、框架配置设置等相关内容。默认的Engine可以通过gin.Default进行创建,或者使用gin.New()同样可以创建。两种方式如下所示:
engine1 := gin.Default()
engine2 := gin.New()
gin.Default()和gin.New()的区别在于gin.Default()也使用gin.New()创建engine实例,但是会默认使用Logger和Recovery中间件。
- Logger是负责进行打印并输出日志的中间件,方便开发者进行程序调试
- Recovery中间件的作用是如果程序执行过程中遇到panic中断了服务,则Recovery会恢复程序执行,并返回服务器500内部错误。通常情况下,我们使用默认的gin.Default创建Engine实例。
处理HTTP请求
在创建的engine实例中,包含很多方法可以直接处理不同类型的HTTP请求。
HTTP请求类型
http协议中一共定义了八种方法或者称之为类型来表明对请求网络资源(Request-URI)的不同的操作方式,分别是:OPTIONS、HEAD、GET、POST、PUT、DELETE、TRACE、CONNECT。
虽然一共有八种请求操作类型,但是实际开发中常用的GET POST DELETE等几种。
get表示从网络上获取一种网络资源,post表示要向服务器提交一段数据,往往在使用的过程当中是在某个网页当中有一个表单数据提交的时候使用post。delete是在删除资源的时候执行。
如果要携带数据,会放在body当中,这样会将携带数据的名称和相应的数据在这里面填入就行了。
通用处理
engine中可以直接进行HTTP请求的处理,在ongine中使用Handle方法进行http请求的处理。Handle 方法包含三个参数,具体如下所示:
func (group *RouterGroup) Handle(httpMethod string, relativePath string, handlers ...HandlerFunc) IRoutes
- httpMethod:第一个参数表示要处理的HTTP的请求类型,是GET、POST、DELETE等8种请求类型中的一种。
- relativePath:第二个参数表示要解析的接口,由开发者进行定义。
- handlers:第三个参数是处理对应的请求的代码的定义。
举例如下:
handler处理GET请求
package main
import (
"fmt"
"github.com/gin-gonic/gin"
)
// 使用handle方法处理/hello这样一个请求
func main() {
//创建engine引擎对象
engine := gin.Default()
//请求路径 http://localhost:8080/hello?name=lucas 带参数name
//匿名函数处理http的请求,context为请求上下文,携带一些属性和方法
engine.Handle("GET", "/hello", func(c *gin.Context) {
path := c.FullPath() //请求的接口
fmt.Println(path)
//获取参数,最后一个参数是获取不到时候的默认值为hello
name := c.DefaultQuery("name", "hello")
fmt.Println(name)
//输出,处理完请求之后需要返回结果给前端
c.Writer.Write([]byte("hello " + name))
})
engine.Run(":8000")
}
/hello
lucas
[GIN] 2023/04/25 - 10:53:09 | 200 | 333.7µs | 127.0.0.1 | GET "/hello?name=lucas"
/hello
hello
[GIN] 2023/04/25 - 10:54:11 | 200 | 0s | 127.0.0.1 | GET "/hello"
通过Handle方法第一个参数指定处理GET类型的请求,解析的接口是/hello。
Context是gin框架中封装的一个结构体,这是gin框架中最重要,最基础的一个结构体对象。
该结构体可以提供我们操作请求,处理请求,获取数据等相关的操作,通常称之为上下文对象,简单说为我们提供操作环境。
可以通过context.Query和context.DefaultQuery获取GET请求携带的参数。可以通过context.Writer.Write向请求发起端返回数据。
handler处理post请求
//post http://localhost:8080/login
//post请求携带数据不和get上面一样,而是放在请求的body里面,也就是请求体里面
engine.Handle("POST", "/login", func(c *gin.Context) {
path := c.FullPath() //请求的接口
fmt.Println(path)
//获取post表单当中数据的哪一个字段
username := c.PostForm("username")
password := c.PostForm("password")
fmt.Println("username:", username, "password:", password)
c.Writer.Write([]byte("username:" + username))
})
如上的案例,通过第一个参数指定了解析POST类型的请求,第二个参数指定解析的接口为/login。POST请求是以form表单的方式提交数据的,可以通过context.PostForm获取表单中提交的数据字段。
其他类型的HTTP请求也可以通过Handle方法处理对应类型的请求。
分类处理
除了engine中包含的通用的处理方法以外,engine还可以按类型进行直接解析。engine中包含有get 方法、post方法、delete方法等与http请求类型对应的方法。
engine.GET()处理GET请求
engine中包含GET方法处理HTTP的GET类型的请求。engine的GET方法包含两个参数,编程使用如下所示:
package main
import (
"fmt"
"github.com/gin-gonic/gin"
)
func main() {
engine := gin.Default()
//http://127.0.0.1/hello?name=lucas
engine.GET("/hello", func(c *gin.Context) {
fmt.Println(c.FullPath())
//查询携带的字段名称,这个没有默认返回参数
name := c.Query("name")
fmt.Println("name:", name)
c.Writer.Write([]byte("name is:" + name))
})
engine.Run()
}
[GIN-debug] Listening and serving HTTP on :8080
/hello
name: lucas
[GIN] 2023/04/26 - 09:06:37 | 200 | 297.4µs | 127.0.0.1 | GET "/hello?name=lucas"
/hello
name:
[GIN] 2023/04/26 - 09:07:12 | 200 | 950.7µs | 127.0.0.1 | GET "/hello?name1=lucas"
package main
import (
"fmt"
"github.com/gin-gonic/gin"
)
func main() {
engine := gin.Default()
engine.POST("/login", func(c *gin.Context) {
fmt.Println(c.FullPath())
if name, exits := c.GetPostForm("username"); exits {
fmt.Println("username is:", name)
}
if password, exits := c.GetPostForm("password"); exits {
fmt.Println("password is:", password)
}
})
engine.Run()
}
[GIN-debug] Listening and serving HTTP on :8080
/login
username is: lucas
password is: 123456
[GIN] 2023/04/26 - 09:13:34 | 200 | 1.5881ms | 127.0.0.1 | POST "/login"
在解析接口的这个地方,通过:自定义变量的值,:id表示变量的值,
package main
import (
"fmt"
"github.com/gin-gonic/gin"
)
func main() {
engine := gin.Default()
engine.DELETE("/user/:id", func(c *gin.Context) {
userID := c.Param("id")
fmt.Println("userid is:", userID)
})
engine.Run()
}
[GIN-debug] Listening and serving HTTP on :8080
userid is: 24
[GIN] 2023/04/26 - 10:05:25 | 200 | 0s | 127.0.0.1 | DELETE "/user/24"
上面介绍了最常用的两种http处理请求的方式,一种是使用handler处理,需要指定具体的请求类型,其次是路由的方法post delete这种进行响应接口类型的处理。
上面同时也介绍了如何获取客户端提交的数据。post get delete.............................。