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

简介: 知识分享之Golang篇是我在日常使用Golang时学习到的各种各样的知识的记录,将其整理出来以文章的形式分享给大家,来进行共同学习。欢迎大家进行持续关注。知识分享系列目前包含Java、Golang、Linux、Docker等等。

知识分享之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处理路由了。

本文声明:

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

目录
相关文章
|
1月前
|
Go 数据安全/隐私保护
go 基于gin编写encode、decode、base64加密接口
go 基于gin编写encode、decode、base64加密接口
15 2
|
11天前
|
编译器 Go C语言
通过例子学习在golang中调试程序
【7月更文挑战第4天】Go语言支持使用cgo进行汇编调试,官方文档在golang.org/doc/asm。注意,调试Go运行时可能遇到变量不可用或行号错误,需谨慎使用step命令。
52 1
通过例子学习在golang中调试程序
|
26天前
|
中间件 Go
go语言后端开发学习(三)——基于validator包实现接口校验
go语言后端开发学习(三)——基于validator包实现接口校验
|
1月前
|
Go
掌握Go语言:Go语言接口精解,实现多态性与灵活性的利器(31)
掌握Go语言:Go语言接口精解,实现多态性与灵活性的利器(31)
|
1月前
|
存储 Go iOS开发
Go 语言接口
Go 语言接口
17 2
|
26天前
|
存储 Go
go语言进阶篇——接口
go语言进阶篇——接口
|
2月前
|
Go
golang学习参考记录
golang学习参考记录
|
2月前
|
JSON Go 数据格式
golang学习7,glang的web的restful接口结构体传参
golang学习7,glang的web的restful接口结构体传参
|
2月前
|
JSON Go 数据格式
golang学习6,glang的web的restful接口传参
golang学习6,glang的web的restful接口传参
|
2月前
|
JSON Go 数据格式
golang学习5,glang的web的restful接口
golang学习5,glang的web的restful接口