Gin中的get和post指的是HTTP请求中的不同方法。当客户端向服务器发起HTTP GET请求时,服务器会将相应的资源返回给客户端;当客户端向服务器发起HTTP POST请求时,服务器会将客户端发送的数据作为请求的一部分处理。
Gin是Go语言编写的一个Web框架,它支持HTTP GET和HTTP Post请求。通常情况下,HTTP GET用于请求数据或资源,而HTTP POST用于向服务器提交数据,比如Web表单。
在Gin中,我们可以使用GET方法来声明一个HTTP Get请求的处理器,例如以下代码:
package main import ( "github.com/gin-gonic/gin" ) func main() { r := gin.Default() r.GET("/hello", func(c *gin.Context) { c.String(200, "Hello, Gin!") }) r.Run() // 启动服务器 }
在上面的例子中,我们声明了一个HTTP Get请求的处理器,它的路由路径是“/hello”,当客户端向服务器发送“/hello”的GET请求时,则会执行此处理器。
这里的Get请求是在没有参数的情况下的一个案例,实际业务中可能有多样性的请求,所以,我们这里补充一下,在GET请求中还有一种类似于(localhost:8080/login?username="xiaomi"&password="123456")这样的访问url链接时候,在路由中如何取值呢?
也就是服务端如何接收 URL链接上参数?
在Gin中,可以使用Param或Query方法获取URL中的查询参数。Param方法可以获取路径参数,而Query方法可以获取查询参数。
例如:
package main import ( "github.com/gin-gonic/gin" ) func main() { r := gin.Default() // /book/123 动态路由 r.GET("/book/:id", func(c *gin.Context) { id := c.Param("id") c.String(200, "Book ID is "+id) }) // /search?query=gin 路由携带参数 r.GET("/search", func(c *gin.Context) { query := c.Query("query") c.String(200, "Search query is "+query) }) r.Run() }
在上面的例子中,我们使用Param方法获取路径参数,通过":id"来指定参数名,在处理器函数中使用c.Param(“id”)获取参数值,最后返回给客户端。我们也使用Query方法获取查询参数,使用"c.Query(“query”)"获取名为"query"的参数值,最后返回给客户端。
这里我们需要注意的是 Param() 和Query()方法的首写字母都是大写, 同时,这两个方法都是
【c *gin.Context】c对象的内置方法。
此外,我们也可以使用POST方法来声明一个HTTP Post请求的处理器,例如以下代码:
package main import ( "github.com/gin-gonic/gin" ) func main() { r := gin.Default() r.POST("/login", func(c *gin.Context) { username := c.PostForm("username") password := c.PostForm("password") // 进行用户验证操作 c.String(200, "登录成功!") }) r.Run() // 启动服务器 }
在上面的例子中,我们声明了一个HTTP Post请求的处理器,它的路由路径是“/login”,当客户端向服务器发送“/login”的POST请求时,则会执行此处理器。在处理器中,我们可以通过c.PostForm方法获取客户端提交的表单数据,并进行相应的处理。
补充说明,在post请求模拟登录或者注册请求时候是结构体的数据,我们需要从请求c.request.body中获取到请求参数处理完成后,返回给客户端(这里不管是否成功与否的情况,这样的状态都一样要处理一下与实际开发环境一致)。如下案例:
package main import ( "net/http" "github.com/gin-gonic/gin" ) // 定义一个 userinfo 表单结构体对象 type UserInfo struct { UserName string `json:"username" form:"username"` Password string `json:"password" form:"password"` Age string `json:"age" form:"age"` } func main() { // 定义一个路由引擎对象 router := gin.Default() // 加载 渲染模板 全局 router.LoadHTMLGlob("*templates/**/*") // 路由 get请求后 返回数据到模板渲染 router.GET("/", func(c *gin.Context) { // c.JSON(200, gin.H{ // "message": "Hello, world!", // }) c.HTML(http.StatusOK, "login/index.html", gin.H{ "title": "登录页面", "content": "这是一个", }) }) // get请求 c.Query()方法获取url【/login?usename="小红"&password="123123"】 上的参数值: router.GET("/login", func(c *gin.Context) { username := c.Query("username") password := c.Query("password") // c.DefaultQuery()方法可以设定默认值,触发的条件是如果获取不到url上这个age参数的值,就返回约定的默认值18 age := c.DefaultQuery("age", "18") // 18 is default value for login form auth form auth // 获取到url传入的参数跳转到 新的页面 首页 渲染到、default/index.html c.HTML(http.StatusOK, "default/index.html", gin.H{ "name": username, "password": password, "age": age, }) }) // GET / 动态路由链接 /logout/1233 其中的1233是这个url上的动态变量值,默认取值就是uid router.GET("/logout/:uid", func(c *gin.Context) { uid := c.Param("uid") // 获取动态路由url链接上的变量值 /logout/1233 这里的值为1233 status := "登出成功" // c.String(http.StatusOK, "uid=%v 状态=%v", uid, status) c.JSON(http.StatusOK, gin.H{ "status": status, "uid": uid, }) }) // 赋值结构体 router.GET("/register", func(ctx *gin.Context) { // ctx.String(http.StatusOK,"成功!!") ctx.HTML(http.StatusOK, "register/index.html", gin.H{}) }) router.POST("/doAdd", func(ctx *gin.Context) { // post请求通过 c.PostForm()方法获取表单数据 // username := ctx.PostForm("username") // password := ctx.PostForm("password") // age := ctx.DefaultPostForm("age", "20") // ctx.JSON(http.StatusOK, gin.H{ // "username": username, // "password": password, // "age": age, // }) // post请求 通过 ctx.ShouldBind(&userInfo) 方法 结构体赋值 userInfo := &UserInfo{} if err := ctx.ShouldBind(&userInfo); err == nil { ctx.JSON(http.StatusOK, gin.H{ "userInfn": userInfo, }) } else { ctx.JSON(http.StatusBadRequest, gin.H{ "error": err.Error(), }) } }) router.Run(":8080") }
其中html页面 default、login、register 文件夹等等只展示一下图片文件结构;
{{define "register/index.html"}}注册页面 {{"注册页面"}}