webrtc远程控制系统源码学习笔记_服务端(一)
1、main.go
func main() {
router := gin.Default() //使用默认中间件创建一个gin路由器,返回engine对象
router.Use(Cors())//添加自定义的中间件Cors,用于解决跨域问题
router.LoadHTMLGlob("templates/*")// 加载templates文件夹下所有的文件
router.Static("/public/img/", "./public/img/")//设置静态文件目录
server.InitDeviceHub() // 初始化Device Hub
//注册路由处理
//get 请求 json 格式化
router.GET("/ping", func(c *gin.Context) {
c.JSON(200, gin.H{
"message": "pong",
})
})
//get 请求 html 界面显示
router.GET("/index", func(c *gin.Context) {
c.HTML(http.StatusOK, "index.html", gin.H{
"nav": "nav_home",
})
})
//get 请求 html 界面显示
router.GET("/doc", func(c *gin.Context) {
doc, _ := ioutil.ReadFile("README.md")
c.HTML(http.StatusOK, "doc.html", gin.H{
"nav": "nav_doc",
"doc": string(doc),
})
})
router.GET("/answer", server.AnswerHandler)
router.GET("/offer", server.OfferHandler)
router.GET("/devices", server.GetDevices)
//运行(默认是8080端口)
router.Run("0.0.0.0:8080")
}
Engine 是 Gin 框架最重要的数据结构,它是框架的入口。我们通过 Engine 对象来定义服务路由信息、组装插件、运行服务。不过 Engine 对象很简单,因为Engine最重要的部分 —— 底层的 HTTP 服务器使用的是 Go 语言内置的 http server,Engine 的本质只是对内置的 HTTP 服务器的包装,让它使用起来更加便捷。
Gin 的 Engine 结构体内嵌了 RouterGroup 结构体,提供了 GET、POST、PUT、DELETE、PATCH、HEAD、OPTIONS 这些http请求方式。
Gin 有一个重要的对象context上下文对象,这个对象存放了engine指针、请求的request对象、返回的responsewriter对象还有一些参数等对象,这个context将在请求一开始就被创建贯穿整个执行过程。最后的返回值可以在responsewrite写,最终返回客户端。
具体对源码的解读可以参考https://segmentfault.com/a/1190000019101583
其中有一个gin.H{ },查看gin框架的源码,声明如下:
// H is a shortcut for map[string]interface{}
type H map[string]interface{}
所以,这只是一个map结构.
注意上面每一个响应中都有一个状态码StatusOK。这个状态码不仅以使用http包中的语义化状态码,语义化的状态码更好理解;也可可以手动指定一个数字,比如:
200 请求成功
404 请求失败,服务器无法根据客户端的请求找到资源(网页)
500 服务器内部错误,无法完成请求
下面解释http协议中常用的状态码:
StatusOK = 200 // RFC 7231, 6.3.1
StatusNotFound = 404 // RFC 7231, 6.5.4
StatusInternalServerError = 500 // RFC 7231, 6.6.1
//自定义中间件,解决跨域访问
func Cors() gin.HandlerFunc {
return func(c *gin.Context) {
method := c.Request.Method
// 这里可以用*,也可以用你指定的域名
c.Header("Access-Control-Allow-Origin", "*")
// 允许头部参数
c.Header("Access-Control-Allow-Headers", "Content-Type,AccessToken,X-CSRF-Token, Authorization, Token")
c.Header("Access-Control-Allow-Methods", "POST, GET, OPTIONS")
c.Header("Access-Control-Expose-Headers", "Content-Length, Access-Control-Allow-Origin, Access-Control-Allow-Headers, Content-Type")
c.Header("Access-Control-Allow-Credentials", "true")
//放行所有OPTIONS方法
if method == "OPTIONS" {
c.AbortWithStatus(http.StatusNoContent)
}
// 处理请求
c.Next()
}
}
跨域的核验是通过header中的数个字段判断的, 通过添加中间件的方式,为请求添加header信息,可以解决跨域问题。
Access-Control-Allow-Origin: 控制可以写入cookie的url
Access-Control-Allow-Headers: 允许的头字段
Access-Control-Allow-Methods: 允许的访问模式