「Golang 框架 Gin 踩坑笔记」跨域问题

IllIIlIlIII · · 197 次点击 · · 开始浏览    

前后端分离,后端使用Gin,POST的接口老是OPTIONS返回404,用postman测试接口正常,最后发现,跨域中间键一定要在你路由组(group)之前全局使用

关键代码如下:

  • router.go
package Router
import (
    "github.com/gin-gonic/gin"
    "gin/Controllers"
    "gin/Middlewares"
)
func InitRouter() {
    router := gin.Default()
    // 要在路由组之前全局使用「跨域中间件」, 否则OPTIONS会返回404
    router.Use(Middlewares.Cors())
    v1 := router.Group("v1")
    {
        v1.GET("/jsontest", Controllers.JsonTest)
        v1.POST("/jsonposttest", Controllers.JsonPostTest)
    }
    
    router.Run(":8080")
}
  • corsMIddleware.go
package Middlewares
import (
    "github.com/gin-gonic/gin"
    "net/http"
)
func Cors() gin.HandlerFunc {
    return func(c *gin.Context) {
        method := c.Request.Method
        origin := c.Request.Header.Get("Origin")
        if origin != "" {
            c.Header("Access-Control-Allow-Origin", origin)
            c.Header("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE, UPDATE")
            c.Header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, Authorization")
            c.Header("Access-Control-Expose-Headers", "Content-Length, Access-Control-Allow-Origin, Access-Control-Allow-Headers, Cache-Control, Content-Language, Content-Type")
            c.Header("Access-Control-Allow-Credentials", "false")
            c.Set("content-type", "application/json")
        }
        if method == "OPTIONS" {
            c.AbortWithStatus(http.StatusNoContent)
        }
        c.Next()
    }
}

本文来自:简书

感谢作者:IllIIlIlIII

查看原文:「Golang 框架 Gin 踩坑笔记」跨域问题

入群交流(和以上内容无关):Go中文网 QQ 交流群:798786647 或加微信入微信群:274768166 备注:入群;关注公众号:Go语言中文网

197 次点击  
加入收藏 微博
上一篇:Types of GoLang
下一篇:闭包的思想
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传