1
votes

gin-contrib / cors renvoie 404

J'ai une API REST golang, qui implémente gin-contrib / cors . Mais lorsque j'appelle une requête POST, la requête de contrôle en amont (OPTIONS) renvoie un résultat 404.

Voici un extrait de l'implémentation:

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)


2 commentaires

Puis-je ajouter le code principal? Il n'y a pas assez d'informations.


Ajoutez votre code principal et les arguments curl de la requête HTTP seront utiles.


4 Réponses :


2
votes

Vous devez ajouter votre middleware cors à votre moteur avant de créer votre groupe. Parce que gin copie tous les middlewares ajoutés au moteur dans le groupe lorsque vous créez le groupe. Donc, si vous l'ajoutez ensuite au moteur, il ne fera pas partie du groupe.

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)


1 commentaires

Logique mais ne fonctionne pas: (Je l'ai déplacé devant gin.new () , mais j'ai quand même obtenu 404 réponses



0
votes

Vous pouvez peut-être essayer d'ajouter des cors sans middleware gin-contrib / cors . J'ai essayé gin-contrib / cors face au même problème puis j'ai ajouté l'en-tête cors manuellement

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()
})


0 commentaires

2
votes
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()
})

make sure you add CORS middleware before you adding group

0 commentaires

2
votes

J'ai eu EXACTEMENT le même problème, mais le positionnement du 'groupe' n'était pas le problème.

voici mon code avec le code du problème commenté et remplacé par des cors manuels ....

// 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()
})


0 commentaires