前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >知识分享之Golang——Gin学习之开放所有接口的OPTION方法

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

作者头像
cn華少
发布2021-12-10 14:05:34
1.5K0
发布2021-12-10 14:05:34
举报
文章被收录于专栏:IT综合技术分享IT综合技术分享

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

背景

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

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

开发环境

内容

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

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

代码语言:javascript
复制
// 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的网关初始化开始时添加上我们定义的这个中间件

代码语言:javascript
复制
    r.Use(Cors())

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

知识共享许可协议

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021/12/3 下,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 知识分享之Golang——Gin学习之开放所有接口的OPTIONS方法
  • 背景
  • 开发环境
  • 内容
相关产品与服务
消息队列 TDMQ
消息队列 TDMQ (Tencent Distributed Message Queue)是腾讯基于 Apache Pulsar 自研的一个云原生消息中间件系列,其中包含兼容Pulsar、RabbitMQ、RocketMQ 等协议的消息队列子产品,得益于其底层计算与存储分离的架构,TDMQ 具备良好的弹性伸缩以及故障恢复能力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档