gin学习记录 - 1 | 青训营;

121 阅读4分钟

1. 下载gin的依赖

直接在终端粘贴以下命令即可下载,下载成功后 go mod 会多出许多内容,部分显示如下:

go-mod.png

go get -u github.com/gin-gonic/gin  

2. 响应

响应字符串,json,html,文件等

状态码: 通常,状态码为 2xx 表示成功,3xx 表示重定向,4xx 表示客户端错误,5xx 表示服务器错误。

  • 导入相应的包
package main  
  
import (  
    "github.com/gin-gonic/gin"  
    "net/http"  
)  
  • 响应字符串
// text/plain; charset=utf-8  
func _string(arg *gin.Context) {  
    // http.StatusOK 值为200 表示正常响应  
    arg.String(http.StatusOK, "你好") // 返回string请求  
}  
  • 响应json数据
  
// application/json; charset=utf-8  
func _json(arg *gin.Context) {  
    // json响应结构体  
    type UserInfo struct {  
        Name string `json:"UserName"`  
        Age int `json:"UserAge"`  
        Pwd string `json:"-"` // '-' 表示忽略转换为json 或者可以把Pwd字段改为小写  
    }  

    user1 := UserInfo{"xm", 23, "123456"}  
    arg.JSON(200, user1) // json序列化 并响应json  

    // json响应map  
    stu := make(map[string]interface{})  
    stu["name"] = "xh"  
    stu["age"] = 21  
    arg.JSON(200, stu)  

    // json直接响应 利用gin.H函数 key为string value为任意类型  
    arg.JSON(200, gin.H{"goods": "banana", "price": 20, "data": gin.H{"other": "aaa"}})  
  
}  
  • 响应 yaml 数据
// 和json类似  
func _yaml(arg *gin.Context) {  
    arg.YAML(200, gin.H{"user_name": "hel", "age": "15", "status": http.StatusOK, "data": gin.H{"other": "aaa"}}) // json序列化 并响应json  
}  
  • 响应html
func _html(arg *gin.Context) {  
    // 接受三个参数 状态码,用于展示相应数据的文件,要相应的数据(用gin.H 一个包含Date:any字段的结构体)  
    arg.HTML(200, "index.html", gin.H{"title": "我是标题"})  
}  
  
func _loadFile(router *gin.Engine) {  
    // 文件响应  
    // 加载单个文件 第一个参数是 网页的url路径 第二个是 要加载的文件路径  
    router.StaticFile("/static/pic", "./static/pic/avatar_github.png")  
    // 加载整个文件夹  
    router.StaticFS("/static/txt", http.Dir("./static/txt/pwd.txt"))  
}  
  • main函数

映射:绑定url路径和路由函数,路径匹配时就会调用对应的函数去处理,第一个参数是url路径 ,第二个参数是调用去处理的函数。

定义GET请求:以router.GET("/html", _html)为例,定义一个GET请求的路由,当客户端向服务器发送GET请求,且请求的URL路径匹配"/html"时,将会调用名为_html的处理函数来处理这个请求。 如,客户端发出如下请求: 127.0.0.1/html

func main() {  
    // 创建默认路由  
    router := gin.Default()  

    // 定义GET请求  
    router.GET("/", _string)  
    router.GET("/json", _json)  
    router.GET("/yaml", _yaml)  

    // 加载模板目录下所有的模板文件 注意路径  
    router.LoadHTMLGlob("./src/templates/*")  
    router.GET("/html", _html)  

    // 文件响应  
    _loadFile(router)  

    // 启动监听 gin会把web服务运行在本机的对应端口上 0.0.0.0是本机的 所有可用的网络接口  
    // router.Run("0.0.0.0:8080") // 修改IP为内网IP 在前面加上0.0.0.0  
    err := router.Run(":80") // 用80端口可以直接访问127.0.0.1就能看到内容 (有时80端口被其他软件占用)  
    if err != nil {  
        return  
    }  
  
    // 另一种启动方式 用原生http服务的方式启动  
    // http.ListenAndServe(":8080",router)  
}  

router.Run() 这样不写表示默认8080端口

重定向

重定向状态码:表示重定向的类型。

  • 区别举例:
  1. 301 永久重定向: 当服务器返回 301 状态码时,浏览器会缓存该重定向,下次再访问原来的 URL 时,会直接跳转到目标 URL。这意味着该重定向是永久性的,搜索引擎会更新它们的索引,将原来的 URL 替换为目标 URL,不再访问原来的 URL。

    例如:当你将自己的网站从 http://example.com 迁移到 http://newexample.com 时,你可以返回 301 状态码,这样浏览器和搜索引擎会把所有原来的链接都指向新的网址。

    示例代码:arg.Redirect(301, "http://newexample.com")

  2. 302 临时重定向: 当服务器返回 302 状态码时,浏览器会将原来的 URL 缓存起来,并跳转到目标 URL。但是浏览器在下次访问原来的 URL 时,会再次请求原来的 URL,而不是直接跳转到目标 URL。这意味着该重定向是临时性的,搜索引擎不会更新它们的索引,仍然保留原来的 URL。

    例如:当你的网站正在进行维护,暂时需要将所有的访问都重定向到一个维护页面,你可以返回 302 状态码。

    示例代码:arg.Redirect(302, "http://maintenance.com")

package main  
// 忽略导包之类的  
func _redirect(arg *gin.Context) {  
    // 第一个参数 状态码 301(永久重定向)或302(临时重定向) 第二个 跳转的地址  
    arg.Redirect(301, "https://baidu.com")  
}  
  
func main() {  
    // 创建默认路由  
    router := gin.Default()  

    // 重定向  
    router.GET("/baidu", _redirect)  

    // 启动监听  
    err := router.Run(":80") // 用80端口可以直接访问127.0.0.1就能看到内容 (有时80端口被其他软件占用)  
    if err != nil {  
        return  
    }  
}