跨域問題可從前后兩端分開排查:
高郵網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián),高郵網(wǎng)站設(shè)計制作,有大型網(wǎng)站制作公司豐富經(jīng)驗。已為高郵數(shù)千家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站建設(shè)公司要多少錢,請找那個售后服務(wù)好的高郵做網(wǎng)站的公司定做!
前端:Vue + axios
axios 請求頭使用 'Content-Type': 'application/json',
并且在Header中設(shè)置了 Authorization 字段用于傳遞 Token,
參數(shù)未經(jīng) Qs 轉(zhuǎn)碼,
使用以下代碼測試登錄接口:
// 為方便操作,已將 axios 實例掛載到 this.$axios 上 this.$axios.post('/signin', {account: '', password: ''}) .then(res => { console.log('成功:', res) }) .catch(err => { console.log('失敗: ', err) })
出現(xiàn)如下錯誤:
Access to XMLHttpRequest at 'http://127.0.0.1:8080/api/v1/signin' from origin 'http://localhost:8081' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: It does not have HTTP ok status.
同時 POST 請求變成了 OPTIONS 請求,并且返回404,如下圖:
這里有兩個問題,一個是為什么 POST 變成了 OPTIONS?URL 路徑?jīng)]錯,為什么又會返回 404?
POST 變 OPTIONS 問題涉及復(fù)雜跨域請求,符合以下任意一個條件的請求就算復(fù)雜請求:
由于設(shè)置的 Authorization 字段,Content-Type 也設(shè)置為了 application/json,因此這個請求算復(fù)雜跨域請求,會在正式通信前增加一次 OPTIONS 查詢請求,稱為"預(yù)檢"請求(preflight request),用于向服務(wù)器請求權(quán)限等信息,預(yù)檢請求被成功響應(yīng)后,才會發(fā)出真實的 POST 請求。
可為什么 OPTIONS 請求返回 404 呢?
通過上面的錯誤說明及分析,答案應(yīng)該很清晰了,就是服務(wù)端路由未對 OPTIONS 類型請求做出響應(yīng),導(dǎo)致 404 的情況。
后端:GoFrame
GoFrame 的路由代碼如下:
func init() { s := g.Server() // 綁定 CORS 中間件 s.BindMiddleware("/api/*", middleware.CORS) s.Group("/api", func(group *ghttp.RouterGroup) { ... // 重點:此路由僅支持 POST group.POST("/signin", userController, "SignIn") } }
/signin 的路由指定了請求方式為 POST,自然無法響應(yīng)其他類型的請求,使用如下方式定義倒是可響應(yīng)所有類型的請求:
group.ALL("/signin", userController, "SignIn")
這樣就使該路由支持所有的請求方法,但需要在控制器的 SignIn 方法中做判斷需要響應(yīng)哪些類型的請求,很繁瑣,不推薦此方式。
其實只要在 CORS 中間件中對 OPTIONS 請求做統(tǒng)一響應(yīng)即可,上代碼:
// CORS 允許接口跨域請求 func CORS(r *ghttp.Request) { // 使用框架默認(rèn)的 CORS 設(shè)置 r.Response.CORSDefault() if r.Method == "OPTIONS" { r.Response.WriteStatusExit(http.StatusOK) } else { r.Middleware.Next() } }
另外需要注意的是,使用 GoFrame 框架,CORS 中間件要在全局添加,如果在路由組中添加,同樣會出現(xiàn) OPTIONS 請求 404 的情況,而且中間件的代碼在請求過程中未執(zhí)行,原因暫不清楚,還需要多了解下框架。
本文描述的跨域問題是在網(wǎng)頁上使用 Vue + axios 時出現(xiàn)的,使用 Postman 工具調(diào)試則一切正常,這里記錄下排查過程和解決方法,希望能幫到有需要的童鞋,有任何問題可以在評論里一起討論下。
到此這篇關(guān)于Vue axios與Go Frame后端框架的Options請求跨域問題詳解的文章就介紹到這了,更多相關(guān)Vue axios與Go Frame跨域內(nèi)容請搜索創(chuàng)新互聯(lián)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持創(chuàng)新互聯(lián)!