【狂神说】Gin框架一小时上手 | 快速转型GoWeb开发 | Go语言零基础教程_哔哩哔哩_bilibili
1.介绍
2.简单程序
1)gin.GET/POST/PUT/DELETE函数
Go Gin 简明教程 | 快速入门 | 极客兔兔 (geektutu.com)
我的理解是:这类函数就像是在监听接口一样,执行后一直在等待,没有捕捉到对应参数就没任何影响,捕捉到了就调用其对应的执行函数。
2)gin.Context
代表上下文信息,是一个结构体,一般用来处理Http请求和响应
Gin源码分析系列之Context篇 - 知乎 (zhihu.com)
20210814学习牛逼的gin.Context - 知乎 (zhihu.com)
3)context.JSON
给前端响应一个JSON信息
4)ginServer.Use(favicon.New("./day.ico"))
给页面标签加一个ico
5)restful api
6)http状态码
const (
StatusContinue = 100 // RFC 9110, 15.2.1
StatusSwitchingProtocols = 101 // RFC 9110, 15.2.2
StatusProcessing = 102 // RFC 2518, 10.1
StatusEarlyHints = 103 // RFC 8297
StatusOK = 200 // RFC 9110, 15.3.1
StatusCreated = 201 // RFC 9110, 15.3.2
StatusAccepted = 202 // RFC 9110, 15.3.3
StatusNonAuthoritativeInfo = 203 // RFC 9110, 15.3.4
StatusNoContent = 204 // RFC 9110, 15.3.5
StatusResetContent = 205 // RFC 9110, 15.3.6
StatusPartialContent = 206 // RFC 9110, 15.3.7
StatusMultiStatus = 207 // RFC 4918, 11.1
StatusAlreadyReported = 208 // RFC 5842, 7.1
StatusIMUsed = 226 // RFC 3229, 10.4.1
StatusMultipleChoices = 300 // RFC 9110, 15.4.1
StatusMovedPermanently = 301 // RFC 9110, 15.4.2
StatusFound = 302 // RFC 9110, 15.4.3
StatusSeeOther = 303 // RFC 9110, 15.4.4
StatusNotModified = 304 // RFC 9110, 15.4.5
StatusUseProxy = 305 // RFC 9110, 15.4.6
_ = 306 // RFC 9110, 15.4.7 (Unused)
StatusTemporaryRedirect = 307 // RFC 9110, 15.4.8
StatusPermanentRedirect = 308 // RFC 9110, 15.4.9
StatusBadRequest = 400 // RFC 9110, 15.5.1
StatusUnauthorized = 401 // RFC 9110, 15.5.2
StatusPaymentRequired = 402 // RFC 9110, 15.5.3
StatusForbidden = 403 // RFC 9110, 15.5.4
StatusNotFound = 404 // RFC 9110, 15.5.5
StatusMethodNotAllowed = 405 // RFC 9110, 15.5.6
StatusNotAcceptable = 406 // RFC 9110, 15.5.7
StatusProxyAuthRequired = 407 // RFC 9110, 15.5.8
StatusRequestTimeout = 408 // RFC 9110, 15.5.9
StatusConflict = 409 // RFC 9110, 15.5.10
StatusGone = 410 // RFC 9110, 15.5.11
StatusLengthRequired = 411 // RFC 9110, 15.5.12
StatusPreconditionFailed = 412 // RFC 9110, 15.5.13
StatusRequestEntityTooLarge = 413 // RFC 9110, 15.5.14
StatusRequestURITooLong = 414 // RFC 9110, 15.5.15
StatusUnsupportedMediaType = 415 // RFC 9110, 15.5.16
StatusRequestedRangeNotSatisfiable = 416 // RFC 9110, 15.5.17
StatusExpectationFailed = 417 // RFC 9110, 15.5.18
StatusTeapot = 418 // RFC 9110, 15.5.19 (Unused)
StatusMisdirectedRequest = 421 // RFC 9110, 15.5.20
StatusUnprocessableEntity = 422 // RFC 9110, 15.5.21
StatusLocked = 423 // RFC 4918, 11.3
StatusFailedDependency = 424 // RFC 4918, 11.4
StatusTooEarly = 425 // RFC 8470, 5.2.
StatusUpgradeRequired = 426 // RFC 9110, 15.5.22
StatusPreconditionRequired = 428 // RFC 6585, 3
StatusTooManyRequests = 429 // RFC 6585, 4
StatusRequestHeaderFieldsTooLarge = 431 // RFC 6585, 5
StatusUnavailableForLegalReasons = 451 // RFC 7725, 3
StatusInternalServerError = 500 // RFC 9110, 15.6.1
StatusNotImplemented = 501 // RFC 9110, 15.6.2
StatusBadGateway = 502 // RFC 9110, 15.6.3
StatusServiceUnavailable = 503 // RFC 9110, 15.6.4
StatusGatewayTimeout = 504 // RFC 9110, 15.6.5
StatusHTTPVersionNotSupported = 505 // RFC 9110, 15.6.6
StatusVariantAlsoNegotiates = 506 // RFC 2295, 8.1
StatusInsufficientStorage = 507 // RFC 4918, 11.5
StatusLoopDetected = 508 // RFC 5842, 7.2
StatusNotExtended = 510 // RFC 2774, 7
StatusNetworkAuthenticationRequired = 511 // RFC 6585, 6
)
3.给前端响应
发送请求和响应
给前端发送json和页面(静态资源)
package main
import (
"net/http"
"github.com/gin-gonic/gin"
"github.com/thinkerou/favicon"
)
func main() {
//·1.创建一个服务
ginServer := gin.Default()
ginServer.Use(favicon.New("./day.ico")) //加网站小icon
//连接数据库之类,之后可以作为一个接口就可以给前端返回数据
// //2.访问地址,处理我们的请求Request Response
// //发送一个GET请求,如果url有hello,会执行后面的函数给前端返回信息
// ginServer.GET("/hello", func(context *gin.Context) {
// context.JSON(200, gin.H{"msg": "helloworld"})
// })
// ginServer.POST("/user", func(c *gin.Context) {
// //返回json数据,状态码200就是http.StatusOK
// c.JSON(200, gin.H{"msg": "post,user"})
// })
// ginServer.PUT("/user")
// ginServer.DELETE("/user")
//3.响应页面给前端
//加载静态页面
ginServer.LoadHTMLGlob("templates/*")
//ginServer.LoadHTMLFiles("templates/index.html") //加载单个
//4.加载资源文件(资源文件位置,根目录位置)
ginServer.Static("/static", "./static")
ginServer.GET("/index", func(c *gin.Context) {
//返回页面
c.HTML(http.StatusOK, "index.html", gin.H{
"msg": "这是go后台传递来的数据...",
})
})
//服务器端口,给一个服务端口,默认8080
ginServer.Run(":8080") //一定有个冒号
}
4.获取请求中的参数
1)前端表单
package main
import (
"encoding/json"
"net/http"
"github.com/gin-gonic/gin"
"github.com/thinkerou/favicon"
)
/*
固定格式:请求,处理请求函数
ginServer.POST("/user", func(c *gin.Context) {
})
*/
func main() {
//·1.创建一个服务
ginServer := gin.Default()
ginServer.Use(favicon.New("./day.ico")) //加网站小icon
//连接数据库之类,之后可以作为一个接口就可以给前端返回数据
//3.响应页面给前端
//加载静态页面
ginServer.LoadHTMLGlob("templates/*")
//ginServer.LoadHTMLFiles("templates/index.html") //加载单个
//4.加载资源文件(资源文件位置,根目录位置)
ginServer.Static("/static", "./static")
ginServer.GET("/index", func(c *gin.Context) {
//返回页面
c.HTML(http.StatusOK, "index.html", gin.H{
"msg": "这是go后台传递来的数据...",
})
})
//7.获取前端表单数据
ginServer.POST("/user/add", func(c *gin.Context) {
//拿到数据
username := c.PostForm("username")
password := c.PostForm("password")
//数据校验
// if username == {
// }
//给前端返回数据
c.JSON(http.StatusOK, gin.H{
"msg": "Ok",
"password": password,
"username": username,
})
})
//服务器端口,给一个服务端口,默认8080
ginServer.Run(":8080") //一定有个冒号
}
2)前端给后端传json
package main
import (
"encoding/json"
"net/http"
"github.com/gin-gonic/gin"
"github.com/thinkerou/favicon"
)
/*
固定格式:请求,处理请求函数
ginServer.POST("/user", func(c *gin.Context) {
})
*/
func main() {
//·1.创建一个服务
ginServer := gin.Default()
ginServer.Use(favicon.New("./day.ico")) //加网站小icon
//前端给后端传json
ginServer.POST("/json", func(c *gin.Context) {
//request.body
data, _ := c.GetRawData() //从请求体获取数据
var m map[string]interface{}
_ = json.Unmarshal(data, &m) //解析后端接收的json
//给前端发送回去
c.JSON(http.StatusOK,m)
})
//服务器端口,给一个服务端口,默认8080
ginServer.Run(":8080") //一定有个冒号
}
3)?&传参
package main
import (
"net/http"
"github.com/gin-gonic/gin"
"github.com/thinkerou/favicon"
)
/*
固定格式:请求,处理请求函数
ginServer.POST("/user", func(c *gin.Context) {
})
*/
func main() {
//·1.创建一个服务
ginServer := gin.Default()
ginServer.Use(favicon.New("./day.ico")) //加网站小icon
//?传参
// url输入 /user/info?userid=xxx&username=kuangshen
ginServer.GET("/user/info", func(c *gin.Context) {
userid := c.Query("userid") //接收前端问号传参的值
username := c.Query("username")
//返回json数据,状态码200就是http.StatusOK
c.JSON(http.StatusOK, gin.H{
"userid": userid,
"username": username,
})
})
//服务器端口,给一个服务端口,默认8080
ginServer.Run(":8080") //一定有个冒号
}
4)RESTful风格传参
package main
import (
"net/http"
"github.com/gin-gonic/gin"
"github.com/thinkerou/favicon"
)
/*
固定格式:请求,处理请求函数
ginServer.POST("/user", func(c *gin.Context) {
})
*/
func main() {
//·1.创建一个服务
ginServer := gin.Default()
ginServer.Use(favicon.New("./day.ico")) //加网站小icon
//RESTful风格传参,冒号后自动接收参数
//url输入 /user/info/1/ kuangshen
ginServer.GET("/user/info/:userid/:username", func(c *gin.Context) {
userid := c.Param("userid")
username := c.Param("username")
//返回json数据,状态码200就是http.StatusOK
c.JSON(http.StatusOK, gin.H{
"userid": userid,
"username": username,
})
})
//服务器端口,给一个服务端口,默认8080
ginServer.Run(":8080") //一定有个冒号
}
5.路由,重定向
1)普通路由
该案例自动跳转必应
// 路由
func route(ginServer *gin.Engine) {
ginServer.GET("test", func(context *gin.Context) {
//重定向状态301
context.Redirect(http.StatusMovedPermanently, "https://www.bing.com")
})
}
2).404
只要输入的访问路径不被已知的请求处理,那么就是404状态,会被该请求捕获并跳转到404.
404页面需要提前加载一下静态资源
// 404页面
func noRoute(ginServer *gin.Engine) {
ginServer.NoRoute(func(context *gin.Context) {
context.HTML(http.StatusNotFound, "404.html", nil) //会从指定的静态资源路径下去找
})
3)路由组
对一个路径下的不同分路径请求进行处理
// 路由组,相当于对一个路径下不同分路径一起做处理
func routeGroup(ginServer *gin.Engine) {
userGroup := ginServer.Group("/user")
{
userGroup.GET("/add")
userGroup.GET("/login")
userGroup.GET("/logout")
}
orderGroup := ginServer.Group("/order")
{
orderGroup.GET("/add")
orderGroup.GET("/delete")
}
}
6.拦截器
1)自定义中间件
流程:定义,注册,指定(可有可无)
注册中间件之后默认给所有请求使用,如果在某个请求里指定了,就只给这一个请求使用。
package main
import (
"encoding/json"
"log"
"net/http"
"github.com/gin-gonic/gin"
"github.com/thinkerou/favicon"
)
// 自定义go中间件拦截器
func myHandler() gin.HandlerFunc {
return func(context *gin.Context) {
//自定义中间件设置的值,在后续处理只要调用了这个中间件的都可以拿到这里的参数
context.Set("usersession", "userid-1")
if true { //放行
context.Next()
} else { //阻止
context.Abort()
}
}
}
// 使用自定义中间件
func handler(ginServer *gin.Engine) {
//这样请求被方法接收之前会先被中间件拦截处理,如果通过,才会被方法接收处理
//?传参
// url输入 /user/info2?userid=xxx&username=kuangshen
ginServer.GET("/user/info2",myHandler(), func(c *gin.Context) {
//取出中间件的值
usersession := c.MustGet("usersession").(string)
log.Println(usersession) //后台打印
userid := c.Query("userid") //接收前端问号传参的值
username := c.Query("username")
c.JSON(http.StatusOK, gin.H{
"userid": userid,
"username": username,
})
})
}
func main() {
//·1.创建一个服务
ginServer := gin.Default()
//注册中间件
ginServer.Use(myHandler())
ginServer.Use(favicon.New("./day.ico")) //加网站小icon
//连接数据库之类,之后可以作为一个接口就可以给前端返回数据
//使用自定义中间件
handler(ginServer)
//服务器端口,给一个服务端口,默认8080
ginServer.Run(":8080") //一定有个冒号
}