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)
4 Réponses :
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)
Logique mais ne fonctionne pas: (Je l'ai déplacé devant gin.new ()
, mais j'ai quand même obtenu 404 réponses
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() })
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
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() })
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.