• 附加Cookie

  • 字符串响应

  • JSON/XML/YAML响应
  1. // You also can use a struct
  2. var msg struct {
  3. Name string `json:"user" xml:"user"`
  4. Message string
  5. Number int
  6. }
  7. msg.Name = "Lena"
  8. msg.Message = "hey"
  9. msg.Number = 123
  10. // 注意 msg.Name 变成了 "user" 字段
  11. // 以下方式都会输出 : {"user": "Lena", "Message": "hey", "Number": 123}
  12. c.JSON(http.StatusOK, gin.H{"user": "Lena", "Message": "hey", "Number": 123})
  13. c.XML(http.StatusOK, gin.H{"user": "Lena", "Message": "hey", "Number": 123})
  14. c.YAML(http.StatusOK, gin.H{"user": "Lena", "Message": "hey", "Number": 123})
  15. c.JSON(http.StatusOK, msg)
  16. c.XML(http.StatusOK, msg)
  17. c.YAML(http.StatusOK, msg)
  18. })
  • 视图响应

先要使用 LoadHTMLTemplates() 方法来加载模板文件

  1. func main() {
  2. router := gin.Default()
  3. //加载模板
  4. router.LoadHTMLGlob("templates/*")
  5. //router.LoadHTMLFiles("templates/template1.html", "templates/template2.html")
  6. //定义路由
  7. router.GET("/index", func(c *gin.Context) {
  8. //根据完整文件名渲染模板,并传递参数
  9. "title": "Main website",
  10. })
  11. router.Run(":8080")
  12. }

模板结构定义

不同文件夹下模板名字可以相同,此时需要 LoadHTMLGlob() 加载两层模板路径

  1. router.LoadHTMLGlob("templates/**/*")
  2. router.GET("/posts/index", func(c *gin.Context) {
  3. c.HTML(http.StatusOK, "posts/index.tmpl", gin.H{
  4. "title": "Posts",
  5. })
  6. c.HTML(http.StatusOK, "users/index.tmpl", gin.H{
  7. "title": "Users",
  8. })
  9. }
  1. <!-- 注意开头 define 与结尾 end 不可少 -->
  2. {{ define "posts/index.tmpl" }}
  3. <html><h1>
  4. {{ .title }}
  5. </h1>
  6. </html>
  7. {{ end }}
  8. gin也可以使用自定义的模板引擎,如下
  9. ```go
  10. import "html/template"
  11. func main() {
  12. router := gin.Default()
  13. html := template.Must(template.ParseFiles("file1", "file2"))
  14. }

  • 文件响应

  • 重定向
  1. r.GET("/redirect", func(c *gin.Context) {
  2. //支持内部和外部的重定向
  3. c.Redirect(http.StatusMovedPermanently, "http://www.baidu.com/")
  4. })

  • 同步异步
  1. func main() {
  2. r := gin.Default()
  3. //1. 异步
  4. r.GET("/long_async", func(c *gin.Context) {
  5. // goroutine 中只能使用只读的上下文 c.Copy()
  6. cCp := c.Copy()
  7. go func() {
  8. time.Sleep(5 * time.Second)
  9. // 注意使用只读上下文
  10. log.Println("Done! in path " + cCp.Request.URL.Path)
  11. }()
  12. })
  13. //2. 同步
  14. r.GET("/long_sync", func(c *gin.Context) {
  15. time.Sleep(5 * time.Second)
  16. // 注意可以使用原始上下文
  17. log.Println("Done! in path " + c.Request.URL.Path)
  18. })
  19. // Listen and serve on 0.0.0.0:8080
  20. }