1.6 gin响应

  • 响应头
  • 附加Cookie
  • 字符串响应
c.String(http.StatusOK, "some string")
  • JSON/XML/YAML响应
r.GET("/moreJSON", func(c *gin.Context) {    // You also can use a struct    var msg struct {        Name    string `json:"user" xml:"user"`        Message string        Number  int    }    msg.Name = "Lena"    msg.Message = "hey"    msg.Number = 123    // 注意 msg.Name 变成了 "user" 字段    // 以下方式都会输出 :   {"user": "Lena", "Message": "hey", "Number": 123}    c.JSON(http.StatusOK, gin.H{"user": "Lena", "Message": "hey", "Number": 123})    c.XML(http.StatusOK, gin.H{"user": "Lena", "Message": "hey", "Number": 123})    c.YAML(http.StatusOK, gin.H{"user": "Lena", "Message": "hey", "Number": 123})    c.JSON(http.StatusOK, msg)    c.XML(http.StatusOK, msg)    c.YAML(http.StatusOK, msg)})
  • 视图响应

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

func main() {    router := gin.Default()    //加载模板    router.LoadHTMLGlob("templates/*")    //router.LoadHTMLFiles("templates/template1.html", "templates/template2.html")    //定义路由    router.GET("/index", func(c *gin.Context) {        //根据完整文件名渲染模板,并传递参数        c.HTML(http.StatusOK, "index.tmpl", gin.H{            "title": "Main website",        })    })    router.Run(":8080")}

模板结构定义

<html>    <h1>        {{ .title }}    </h1></html>

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

router.LoadHTMLGlob("templates/**/*")router.GET("/posts/index", func(c *gin.Context) {    c.HTML(http.StatusOK, "posts/index.tmpl", gin.H{        "title": "Posts",    })    c.HTML(http.StatusOK, "users/index.tmpl", gin.H{        "title": "Users",    })}

templates/posts/index.tmpl

<!-- 注意开头 define 与结尾 end 不可少 -->{{ define "posts/index.tmpl" }}<html><h1>    {{ .title }}</h1></html>{{ end }}gin也可以使用自定义的模板引擎,如下```goimport "html/template"func main() {    router := gin.Default()    html := template.Must(template.ParseFiles("file1", "file2"))    router.SetHTMLTemplate(html)    router.Run(":8080")}
  • 文件响应
//获取当前文件的相对路径router.Static("/assets", "./assets")//router.StaticFS("/more_static", http.Dir("my_file_system"))//获取相对路径下的文件router.StaticFile("/favicon.ico", "./resources/favicon.ico")
  • 重定向
r.GET("/redirect", func(c *gin.Context) {    //支持内部和外部的重定向    c.Redirect(http.StatusMovedPermanently, "http://www.baidu.com/")})
  • 同步异步

goroutine 机制可以方便地实现异步处理

func main() {    r := gin.Default()    //1. 异步    r.GET("/long_async", func(c *gin.Context) {        // goroutine 中只能使用只读的上下文 c.Copy()        cCp := c.Copy()        go func() {            time.Sleep(5 * time.Second)            // 注意使用只读上下文            log.Println("Done! in path " + cCp.Request.URL.Path)        }()    })    //2. 同步    r.GET("/long_sync", func(c *gin.Context) {        time.Sleep(5 * time.Second)        // 注意可以使用原始上下文        log.Println("Done! in path " + c.Request.URL.Path)    })    // Listen and serve on 0.0.0.0:8080    r.Run(":8080")}

Leave a Reply

Your email address will not be published. Required fields are marked *