Go语言 使用Gin Web框架时,DELETE和PUT请求不起作用(缺少Access-Control-Allow-Orgin头)

oxcyiej7  于 2023-02-27  发布在  Go
关注(0)|答案(1)|浏览(173)

我在网上看到过很多类似的问题,我尝试过所有的解决方案,但都不起作用。例如,这个问题Go gin framework CORS
现在,我有一个运行在localhost:3000上的react应用程序,它像这样调用我的rest API

axios.delete('http://localhost:8080/api/v1/profile/', {
    name : "test"
}).catch(function (error) {
    console.log(error);
})

我已经使用了GET和POST请求(工作),但是DELETE和PUT返回
“CORS策略已阻止从源”http://localhost:3000“访问位于”http://localhost:8080/api/v1/profile/“的XMLHttpRequest:请求的资源上不存在“Access-Control-Allow-Origin”标头。”
对于我的rest API来说,这是相关的代码(我正在使用gin web框架)

package main

import (
    "github.com/gin-gonic/gin"
)

func main() {

    r := gin.Default()

    r.Use(CORSMiddleware())
    
    v1 := r.Group("/api/v1")
    {
      v1.GET("profile", GetProfiles)
      v1.POST("profile", AddProfile)
      v1.PUT("profile", UpdateProfile)
      v1.DELETE("profile", DeleteProfile)
      
    }
     r.Run()
   

}

func CORSMiddleware() gin.HandlerFunc {
    return func(c *gin.Context) {

        c.Header("Access-Control-Allow-Origin", "http://localhost:3000")
        c.Header("Access-Control-Allow-Credentials", "true")
        c.Header("Access-Control-Allow-Headers", "Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization, accept, origin, Cache-Control, X-Requested-With")
        c.Header("Access-Control-Allow-Methods", "POST,HEAD,PATCH,OPTIONS,GET,PUT,DELETE")

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

        c.Next()
    }
}

然而,即使在标头中使用DELETE和PUT,它也不起作用。可能是什么问题呢?

g0czyy6m

g0czyy6m1#

应该归咎于请求URL中的尾部斜杠/http://localhost:8080/api/v1/profile/应该是http://localhost:8080/api/v1/profile
如果在浏览器中检查HTTP请求,您应该看到响应状态为307 Temporary Redirect
来自Gin的调试日志是:

[GIN] 2023/02/24 - 13:37:43 | 204 |      13.223µs |             ::1 | OPTIONS  "/api/v1/profile/"
[GIN-debug] redirecting request 307: /api/v1/profile --> /api/v1/profile

请参阅RedirectTrailingSlash的文档:https://pkg.go.dev/github.com/gin-gonic/gin#Engine

RedirectTrailingSlash在无法匹配当前路由但存在带(不带)尾斜杠的路径的处理程序时启用自动重定向。例如,如果请求/foo/,但只存在/foo的路由,则客户端将重定向到/foo,对于GET请求,http状态代码为301,对于所有其他请求方法,http状态代码为307。

相关问题