我在网上看到过很多类似的问题,我尝试过所有的解决方案,但都不起作用。例如,这个问题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,它也不起作用。可能是什么问题呢?
1条答案
按热度按时间g0czyy6m1#
应该归咎于请求URL中的尾部斜杠
/
。http://localhost:8080/api/v1/profile/
应该是http://localhost:8080/api/v1/profile
。如果在浏览器中检查HTTP请求,您应该看到响应状态为
307 Temporary Redirect
。来自Gin的调试日志是:
请参阅
RedirectTrailingSlash
的文档:https://pkg.go.dev/github.com/gin-gonic/gin#EngineRedirectTrailingSlash在无法匹配当前路由但存在带(不带)尾斜杠的路径的处理程序时启用自动重定向。例如,如果请求
/foo/
,但只存在/foo
的路由,则客户端将重定向到/foo
,对于GET请求,http状态代码为301,对于所有其他请求方法,http状态代码为307。