Gin-contrib/cors возвращает 404

У меня есть REST API golang, который реализует gin-contrib/cors. Но когда я вызываю запрос POST, предварительный запрос (OPTIONS) возвращает результат 404.

Вот фрагмент реализации:

engine := gin.New()
group := engine.Group("/api/v1")

// Recovery middleware recovers from any panics and writes a 500 if there was one.
group.Use(gin.Recovery())

// Set cors and db middleware
engine.Use(cors.New(cors.Config{
    AllowOrigins:     []string{"*"},
    AllowMethods:     []string{"*"},
    AllowHeaders:     []string{"*"},
    AllowCredentials: true,     
    MaxAge: 12 * time.Hour,
}))

// Register routes
group.POST("/customers", ctrl.SendRequest)

Могу ли я добавить основной код? Недостаточно информации.

sh.seo 26.03.2019 01:49

Добавьте свой основной код, и аргументы curl HTTP-запроса будут полезны.

beiping96 26.03.2019 02:35
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
API ввода вопросов - это полезный инструмент для интеграции моделей машинного обучения, таких как ChatGPT, в приложения, требующие обработки...
1
2
2 085
4

Ответы 4

Перед созданием группы вам необходимо добавить промежуточное ПО Cors в ваш движок. Потому что gin копирует все промежуточные программы, добавленные в движок, в группу при ее создании. Поэтому, если вы добавите его позже в движок, он не будет частью группы.

engine := gin.New()

// Set cors and db middleware
engine.Use(cors.New(cors.Config{
    AllowOrigins:     []string{"*"},
    AllowMethods:     []string{"*"},
    AllowHeaders:     []string{"*"},
    AllowCredentials: true,     
    MaxAge: 12 * time.Hour,
}))

group := engine.Group("/api/v1")

// Recovery middleware recovers from any panics and writes a 500 if there was one.
group.Use(gin.Recovery())

// Register routes
group.POST("/customers", ctrl.SendRequest)

Звучит логично, но не работает :( Я переместил его перед gin.new(), но все равно получил 404 ответа

Markus Kollers 26.03.2019 22:24

Может быть, вы можете попробовать добавить cors без gin-contrib/cors промежуточного программного обеспечения. Я пробовал gin-contrib/cors столкнулся с той же проблемой, а затем добавил заголовок cors вручную.

router := gin.New()
router.Use(func(context *gin.Context) {
    context.Writer.Header().Add("Access-Control-Allow-Origin", "*")
    context.Writer.Header().Add("Access-Control-Max-Age", "10000")
    context.Writer.Header().Add("Access-Control-Allow-Methods", "GET,HEAD,POST,PUT,PATCH,DELETE,OPTIONS")
    context.Writer.Header().Add("Access-Control-Allow-Headers", "Authorization,Content-Type,Accept")
    context.Next()
})
engine := gin.New()

engine.Use(func(c *gin.Context) {
    c.Writer.Header().Set("Access-Control-Allow-Origin", "*")
    c.Writer.Header().Set("Access-Control-Allow-Credentials", "true")
    c.Writer.Header().Set("Access-Control-Allow-Headers", "Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization, accept, origin, Cache-Control, X-Requested-With")
    c.Writer.Header().Set("Access-Control-Allow-Methods", "POST, OPTIONS, GET, PUT, DELETE")

    if c.Request.Method == "OPTIONS" {
        c.AbortWithStatus(204)
        return
    }

    c.Next()
})

убедитесь, что вы добавили промежуточное ПО CORS, прежде чем добавлять группу

У меня была ТОЧНО такая же проблема, но позиционирование «группы» не было проблемой.

вот мой код с кодом проблемы, закомментированным и замененным ручным кодом....

// router.Use(cors.New(cors.Config{
//  // AllowAllOrigins: true,
//  AllowOrigins:     []string{"*"},
//  AllowMethods:     []string{"GET", "POST", "PUT", "PATCH", "DELETE", "OPTIONS"},
//  AllowHeaders:     []string{"Origin", "Accept", "Content-Type", "Content-Length", "Accept-Encoding", "X-CSRF-Token", "Authorization", "ResponseType"},
//  ExposeHeaders:    []string{"Content-Length"},
//  AllowCredentials: true,
//  MaxAge:           12 * time.Hour,
// }))

router.Use(func(c *gin.Context) {
    c.Writer.Header().Set("Access-Control-Allow-Origin", "*")
    c.Writer.Header().Set("Access-Control-Allow-Credentials", "true")
    c.Writer.Header().Set("Access-Control-Allow-Headers", "Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization, ResponseType, accept, origin, Cache-Control, X-Requested-With")
    c.Writer.Header().Set("Access-Control-Allow-Methods", "POST, OPTIONS, GET, PUT, DELETE")

    if c.Request.Method == "OPTIONS" {
        c.AbortWithStatus(204)
        return
    }
    c.Next()
})

Другие вопросы по теме