1. 下载gin的依赖
直接在终端粘贴以下命令即可下载,下载成功后 go mod 会多出许多内容,部分显示如下:
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端口
重定向
重定向状态码:表示重定向的类型。
- 区别举例:
-
301 永久重定向: 当服务器返回
301状态码时,浏览器会缓存该重定向,下次再访问原来的 URL 时,会直接跳转到目标 URL。这意味着该重定向是永久性的,搜索引擎会更新它们的索引,将原来的 URL 替换为目标 URL,不再访问原来的 URL。例如:当你将自己的网站从
http://example.com迁移到http://newexample.com时,你可以返回301状态码,这样浏览器和搜索引擎会把所有原来的链接都指向新的网址。示例代码:
arg.Redirect(301, "http://newexample.com") -
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
}
}