渲染一个HTML文件
LoadHTMLFiles()
渲染多个HTML文件
LoadHTMLGlob()
示例:
func main(){
//返回默认的路由引擎
r := gin.Default()
//HTML渲染
//渲染一个
//r.LoadHTMLFiles("template/test01.html")
//渲染多个
//r.LoadHTMLFiles("template/test01.html","template/test02.html")
r.LoadHTMLGlob("template/*")
//使用不同目录下名称相同的模板
//r.LoadHTMLGlob("templates/**/*")
r.GET("/test02", func(c *gin.Context) {
c.HTML(http.StatusOK,"test02.html",gin.H{
"title" : "test02",
})
})
r.Run(":8080")
}
返回页面的是json格式
json返回一个结构体
type charater struct {
Name string `json:"姓名"`
Address string `json:"地址"`
Age int `json:"年龄"`
}
r.GET("/",func (c *gin.Context){
char := charater{
Name : "依古比古",
Address : "花园宝宝",
Age : 3,
}
c.JSON(http.StatusOK,char)
})
//{"姓名":"依古比古","地址":"花园宝宝","年龄":3}
json返回一个map
r.GET("/", func(c *gin.Context) {
m := map[string]interface{}{
"name" : "玛卡巴卡",
"address" : "花园宝宝",
"age" : 3,
}
c.JSON(http.StatusOK,m)
})
//{"address":"花园宝宝","age":3,"name":"玛卡巴卡"}
//获取浏览器发出请求携带的 query string 参数
//http://127.0.0.1:8000/web?name=派大星&age=2
问号后面为携带的参数,多个参数用&符号隔开
Query()
DefaultQuery() //取不到就用默认值
GetQuery() // 取不到值就返回false
示例
func main(){
r := gin.Default()
r.GET("/web", func(c *gin.Context) {
//获取浏览器发出请求携带的 query string 参数
//http://127.0.0.1:8000/web?name=派大星&age=2
name := c.Query("name")
age := c.Query("age")
//取不到就用默认值smoebody
//name := c.DefaultQuery("name","somebody")
//取不到值就返回false
//name ,ok := c.GetQuery("name")
//if !ok { // 若取不到值 ok即为false
// name = "body"
//}
c.JSON(http.StatusOK,gin.H{
"name" : name,
"age" : age,
})
})
r.Run(":8080")
}
PostForm()
DefaultPostForm() //取不到就用默认值
GetPostForm() // 取不到值就返回false
示例
func main() {
r := gin.Default()
r.LoadHTMLFiles("./template/login.html", "./template/index.html")
r.GET("/login", func(c *gin.Context) {
c.HTML(http.StatusOK, "login.html", nil)
})
r.POST("/login", func(c *gin.Context) {
//获取form表单的内容
username := c.PostForm("username")
password := c.PostForm("password")
//username := c.DefaultPostForm("username","sb")
//password := c.DefaultPostForm("****","****")
//username,ok := c.GetPostForm("username")
//if !ok {
// username = "sb"
//}
//password,ok := c.GetPostForm("password")
//if !ok {
// password = "***"
//}
c.HTML(http.StatusOK, "index.html", gin.H{
"Name": username,
"Password" : password,
})
})
r.Run(":8080")
}
获取请求的Path(URL)参数,返回的都是字符串类型
注意URL的匹配不要冲突
Param()
示例
func main() {
r := gin.Default()
//获取URL路径参数
r.GET("/user/:name/:age",func (c *gin.Context){
name := c.Param("name")
age := c.Param("age")
c.JSON(http.StatusOK,gin.H{
"name" : name,
"age" : age,
})
})
r.GET("/message/:year/:address", func(c *gin.Context) {
year := c.Param("year")
address := c.Param("address")
c.JSON(http.StatusOK,gin.H{
"year" : year,
"address" : address,
})
})
r.Run(":8080")
}
跳转到其他页面
Redirect()
跳转到其他路径对应的路由处理函数
c.Request.URL.Path = "/其他路径" //把请求的URL修改
r.HandleContext(c) //继续后续的处理
示例
func main(){
r := gin.Default()
r.GET("/index", func(c *gin.Context) {
//跳转到其他页面
//http.StatusMovedPermanently 301
c.Redirect(http.StatusMovedPermanently,"http://www.baidu.com")
})
r.GET("/a", func(c *gin.Context) {
//跳转到 /b 对应的路由处理函数
c.Request.URL.Path = "/b" //把请求的URL修改
r.HandleContext(c) //继续后续的处理
})
r.GET("/b", func(c *gin.Context) {
c.JSON(http.StatusOK,gin.H{
"status" : "ok",
"func" : "b",
})
})
r.Run(":8080")
}
路由
func main() {
r := gin.Default()
//路由
//r.GET("/index", func(c *gin.Context) {
// c.JSON(http.StatusOK, gin.H{
// "methed": "GET",
// })
//})
//r.POST("/index", func(c *gin.Context) {
// c.JSON(http.StatusOK, gin.H{
// "methed": "POST",
// })
//})
//请求方法大集合
r.Any("/index", func(c *gin.Context) {
switch c.Request.Method {
case "GET":
c.JSON(http.StatusOK, gin.H{
"method": "GET",
})
case "POST":
c.JSON(http.StatusOK, gin.H{
"method": "POST",
})
case http.MethodPut:
c.JSON(http.StatusOK, gin.H{
"method": "PUT",
})
}
})
//访问不存在的页面
r.NoRoute(func(c *gin.Context) {
//http.StatusNotFound 404
c.JSON(http.StatusNotFound, gin.H{
"message": "哈哈哈,没有找到指定的页面呀!",
})
})
r.Run(":8080")
}
路由组
路由组 多用于区分不同的业务线和API版本
把公用的前缀提取出来 创建一个路由组
//把公用的前缀提取出来 创建一个路由组
shopGroup := r.Group("/shop")
{
shopGroup.GET("/index", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"message": "/shop/index",
})
})
shopGroup.GET("/login", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"message": "/shop/login",
})
})
shopGroup.GET("/haha", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"message": "/shop/haha",
})
})
}
func main() {
// 新建一个没有任何默认中间件的路由
r := gin.New()
// 全局中间件
// Logger 中间件将日志写入 gin.DefaultWriter,即使你将 GIN_MODE 设置为 release。
// By default gin.DefaultWriter = os.Stdout
r.Use(gin.Logger())
// Recovery 中间件会 recover 任何 panic。如果有 panic 的话,会写入 500。
r.Use(gin.Recovery())
// 你可以为每个路由添加任意数量的中间件。
r.GET("/benchmark", MyBenchLogger(), benchEndpoint)
// 认证路由组
// authorized := r.Group("/", AuthRequired())
// 和使用以下两行代码的效果完全一样:
authorized := r.Group("/")
// 路由组中间件! 在此例中,我们在 "authorized" 路由组中使用自定义创建的
// AuthRequired() 中间件
authorized.Use(AuthRequired())
{
authorized.POST("/login", loginEndpoint)
authorized.POST("/submit", submitEndpoint)
authorized.POST("/read", readEndpoint)
// 嵌套路由组
testing := authorized.Group("testing")
testing.GET("/analytics", analyticsEndpoint)
}
// 监听并在 0.0.0.0:8080 上启动服务
r.Run(":8080")
}