Go语言框架之Gin使用(二) | 青训营

209 阅读3分钟

Gin框架使用入门

Gin是一个使用Go语言编写的HTTP Web框架,它拥有极高的性能和简洁明快的语法,在Go语言开发社区中非常受欢迎。Gin的API简单易用,对初学者十分友好,而且提供了中文文档,容易上手。

响应

Gin框架提供了不同的方法将不同的格式的数据写入响应体。例如c.String返回字符串,c.Json返回Json格式的数据。但无论是哪种方法都需要携带响应状态码。

状态码

在go语言的http包里面定义了状态码(超文本传输协议(HTTP)状态代码),常用的有

  • StatusOK = 200 // 表示请求成功。一般用于GET与POST请求
  • StatusNoContent = 204 // 表示暂且无内容。意味着服务器成功处理,但未返回内容,在未更新网页的情况下,可确保浏览器继续显示当前文档
  • StatusPartialContent = 206 // 对资源某一部分的请求,服务器成功处理了部分GET请求,响应报文有指定范围的实体内容。
  • StatusMovedPermanently = 301 // 永久性重定向。请求的资源已被永久的移动到新URI。将来任何对此资源的引用都应该使用本响应返回的若干个 URI 之一。如果可能,拥有链接编辑功能的客户端应当自动把请求的地址修改为从服务器反馈回来的地址。这个响应是可缓存的。
  • StatusFound = 302 // 临时性重定向。资源只是临时被移动。由于这样的重定向是临时的,客户端应当继续向原有地址发送以后的请求。只有在Cache-Control或Expires中进行了指定的情况下,这个响应才是可缓存的。
  • StatusBadRequest = 400 // 客户端请求报文中存在语法错误,服务器无法处理。
  • StatusUnauthorized = 401 // 请求要求用户的身份认证,若之前已进行过一次请求,则表示用户认证失败。
  • StatusForbidden = 403 // 服务器拒绝执行此请求。
  • StatusNotFound = 404 // 服务器无法根据客户端的请求找到资源。
  • StatusInternalServerError = 500 // 服务器内部错误,无法完成
  • StatusServiceUnavailable = 503 // 服务器超载或系统维护,无法处理客户端的请求。

响应字符串

router.GET("/string", func(c *gin.Context) {
  c.String(http.StatusOK, "string")
})

响应Json

router.GET("/json", func(c *gin.Context) {
  c.JSON(http.StatusOK, gin.H{"message": "x", "status": http.StatusOK})
})

gin.H就是 map[string]interface{} 的缩写,方便使用。 不仅可以使用gin.H,也可以直接传递结构体。默认结构体的字段会全小写转化为返回的json的键名,也可以在结构体后绑定json:"name"标签来自己命名。

响应xml

方法和响应json时类似

router.GET("/xml", func(c *gin.Context) {
  c.XML(http.StatusOK, gin.H{"user": "x"})
})

响应html

router.LoadHTMLFiles("html/index.html")
router.GET("/html", func(c *gin.Context) {
  c.HTML(200, "index.html", "xxx")
})

响应html时,首先要使用LoadHTMLFiles()方法来加载模板文件。然后使用c.html响应并传递参数。

LoadHTMLFiles()方法可以加载多个模板文件,但是如果我们模板文件太多的话,使用它就比较麻烦,对此Gin提供了LoadHTMLGlob()方法,可以加载一个目录下的所有模板。

router.LoadHTMLGlob("html/*")

上面的改成这样,表示加载html目录下的所有模板文件,效果是一样的。

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

router.LoadHTMLGlob("html/**/*")

响应文件

在golang中,没有相对文件的路径,它只有相对项目的路径。

router.StaticFS("/static", http.Dir("static/static"))

网页请求这个静态目录的前缀, 第二个参数是一个目录。

router.StaticFile("/titian.png", "static/titian.png")

配置单个文件,第一个参数是网页请求的路由,第二个参数为文件的路径。

重定向响应

使用Redirect()方法

router.GET("/redirect", func(c *gin.Context) {
    c.Redirect(http.StatusMovedPermanently, "http://www.baidu.com/")
})

这样使用GET方法请求/redirect路由时,会自动跳转到 www.baidu.com/ ,也就是百度首页。