问题表现
同一个项目请求同一个服务时,Get和Post请求正常,但是Put和Delete一直报跨域错误的问题
Access to XMLHttpRequest at 'http://127.0.0.1:8011/api/organization' from origin 'http://localhost:9527' has been blocked by CORS policy: Method PUT is not allowed by Access-Control-Allow-Methods in preflight response.
解决方案
根据问题描述,很清楚是PUT
方法不行,于是去查看服务端的跨域中间件, 发现没有在Header中明确指定Access-Control-Allow-Headers
,于是添加Allow Methods的设置,, 以下是完整的跨域中间件:
package middlewareimport ("net/http""github.com/gin-gonic/gin")func CORSMiddleware() gin.HandlerFunc {return func(ctx *gin.Context) {ctx.Writer.Header().Set("Access-Control-Allow-Origin", "*")ctx.Writer.Header().Set("Access-Control-Max-Age", "86400")ctx.Writer.Header().Set("Access-Control-Allow-Headers", "*")ctx.Writer.Header().Set("Access-Control-Allow-Methods", "*") //出问题是缺少这里ctx.Writer.Header().Set("Access-Control-Allow-Credentials", "true")if ctx.Request.Method == http.MethodOptions {ctx.AbortWithStatus(200)} else {ctx.Next()}}}
反思
问题本身没有什么,但有意思的是过程,因为我先写的服务端,且确定加了跨域的中间件,且在写前端的时候,之前常用的Get和Post访问都没有出现跨域的问题,所以问题出现时,没有第一时间联系到时服务端的问题。
网上查了些信息,整体描述是因为Get和Post的方法是默认的,所以及时没有明确设置也可以通过,但是其他的方法就需要显示的设置。