go学习———gin

15 篇文章 0 订阅

HTML渲染

渲染一个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")
}

gin框架返回json

返回页面的是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参数

//获取浏览器发出请求携带的 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")
}

获取form表单的内容

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")
}

获取URL路径参数

获取请求的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")
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值