美文网首页Golang语言知识库
知识分享之Golang——Gin学习之开放所有接口的OPTION

知识分享之Golang——Gin学习之开放所有接口的OPTION

作者: cn華少 | 来源:发表于2021-12-03 22:35 被阅读0次

    知识分享之Golang——Gin学习之开放所有接口的OPTIONS方法

    背景

    知识分享之Golang篇是我在日常使用Golang时学习到的各种各样的知识的记录,将其整理出来以文章的形式分享给大家,来进行共同学习。欢迎大家进行持续关注。

    知识分享系列目前包含Java、Golang、Linux、Docker等等。

    开发环境

    内容

    我们在进行编写前后端分离项目时经常遇到前端需要先使用OPTION请求进行尝试可达性再进行请求,而使用gin开发时我们不能全部api都配置一个option请求,这样太过繁琐和管理,因此我们就需要合理使用gin的另一个特性,自定义中间件。

    1、首先我们先建一个中间件
    这个中间件将根据请求类型进行判定,如果请求类型是origin,则拼接形成一个响应,直接响应客户端可以正常访问。

    // Cors 开放所有接口的OPTIONS方法
    func Cors() gin.HandlerFunc {
        return func(c *gin.Context) {
            method := c.Request.Method               //请求方法
            origin := c.Request.Header.Get("Origin") //请求头部
            var headerKeys []string                  // 声明请求头keys
            for k, _ := range c.Request.Header {
                headerKeys = append(headerKeys, k)
            }
            headerStr := strings.Join(headerKeys, ", ")
            if headerStr != "" {
                headerStr = fmt.Sprintf("access-control-allow-origin, access-control-allow-headers, %s", headerStr)
            } else {
                headerStr = "access-control-allow-origin, access-control-allow-headers"
            }
            if origin != "" {
                origin := c.Request.Header.Get("Origin")
                c.Header("Access-Control-Allow-Origin", origin)                                    // 这是允许访问所有域
                c.Header("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE,UPDATE") //服务器支持的所有跨域请求的方法,为了避免浏览次请求的多次'预检'请求
                //  header的类型
                c.Header("Access-Control-Allow-Headers", "Authorization, Content-Length, X-CSRF-Token, Token,session,X_Requested_With,Accept, Origin, Host, Connection, Accept-Encoding, Accept-Language,DNT, X-CustomHeader, Keep-Alive, User-Agent, X-Requested-With, If-Modified-Since, Cache-Control, Content-Type, Pragma")
                //              允许跨域设置                                                                                                      可以返回其他子段
                c.Header("Access-Control-Expose-Headers", "Content-Length, Access-Control-Allow-Origin, Access-Control-Allow-Headers,Cache-Control,Content-Language,Content-Type,Expires,Last-Modified,Pragma,FooBar") // 跨域关键设置 让浏览器可以解析
                c.Header("Access-Control-Max-Age", "172800")                                                                                                                                                           // 缓存请求信息 单位为秒
                c.Header("Access-Control-Allow-Credentials", "false")                                                                                                                                                  //  跨域请求是否需要带cookie信息 默认设置为true
                c.Set("content-type", "application/json")                                                                                                                                                              // 设置返回格式是json
            }
    
            //放行所有OPTIONS方法
            if method == "OPTIONS" {
                c.JSON(http.StatusOK, "Options Request!")
            }
            // 处理请求
            c.Next() //  处理请求
        }
    }
    

    2、在gin的网关初始化开始时添加上我们定义的这个中间件

        r.Use(Cors())
    

    这样就完成了所有option请求的统一化响应,不用再写一堆的option处理路由了。

    本文声明:
    88x31.png
    知识共享许可协议
    本作品由 cn華少 采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。

    相关文章

      网友评论

        本文标题:知识分享之Golang——Gin学习之开放所有接口的OPTION

        本文链接:https://www.haomeiwen.com/subject/awoyxrtx.html