r.Group后的大括号可以不要
package main
import (
"fmt"
"html/template"
"log"
"mime/multipart"
"net/http"
"path"
"time"
"github.com/gin-gonic/gin"
)
func main() {
mainGin()
}
func mainGin() {
r := gin.Default()
g1 := r.Group("/g1")
{
// get /g1/1
g1.GET("/1", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{"msg": "g11"})
})
// post /g1/2
g1.POST("/2", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{"msg": "g12"})
})
g2 := g1.Group("/g2")
{
// get /g1/g2/1
g2.GET("/3", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{"msg": "g23"})
})
}
}
//处理url请求
r.NoRoute(func(c *gin.Context) {
c.HTML(http.StatusNotFound, "404.html", nil)
})
//请求转发
r.GET("/b5", func(c *gin.Context) {
c.Request.URL.Path = "/b2"
r.HandleContext(c)
})
//重定向
r.GET("/b4", func(c *gin.Context) {
c.Redirect(http.StatusFound, "https://www.google.com")
})
//重定向
r.GET("/b3", func(c *gin.Context) {
//c.Redirect(http.StatusTemporaryRedirect, "/b2")
c.Redirect(http.StatusMovedPermanently, "/b2")
})
重定向遇到的method的bug:
访问项目时,使用中间件查看session里有没有user字段,
如果没有就重定向到login,login的get/post和logout没有使用中间件。
代码是c.Redirect(http.StatusPermanentRedirect , "/login")。
发现get方法访问就get到此页面(正常),post访问就post到此页面(异常),
因为post用来提交登录信息。需要全都设置为get方法。
一开始修改c.Request.Method="GET",发现method是改了,依旧是POST请求。
解决方法:
重定向代码改成c.Redirect(http.StatusMovedPermanently , "/login")
参考https://gin-gonic.com/zh-cn/docs/examples/redirects/
和http://psychedelicnekopunch.com/archives/1848
推荐使用301(StatusMovedPermanently)或302(StatusFound)