欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Vue axios與Go Frame后端框架的Options請(qǐng)求跨域問(wèn)題詳解

 更新時(shí)間:2020年03月03日 11:06:02   作者:大漠風(fēng)起沙飛揚(yáng)  
這篇文章主要介紹了Vue axios與Go Frame后端框架的Options請(qǐng)求跨域問(wèn)題詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

跨域問(wèn)題可從前后兩端分開(kāi)排查:

前端:Vue + axios

axios 請(qǐng)求頭使用 'Content-Type': 'application/json',

并且在Header中設(shè)置了 Authorization 字段用于傳遞 Token,

參數(shù)未經(jīng) Qs 轉(zhuǎn)碼,

使用以下代碼測(cè)試登錄接口:

// 為方便操作,已將 axios 實(shí)例掛載到 this.$axios 上
this.$axios.post('/signin', {account: '', password: ''})
 .then(res => {
  console.log('成功:', res)
 })
 .catch(err => {
  console.log('失敗: ', err)
 })

出現(xiàn)如下錯(cuò)誤:

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.

同時(shí) POST 請(qǐng)求變成了 OPTIONS 請(qǐng)求,并且返回404,如下圖:

這里有兩個(gè)問(wèn)題,一個(gè)是為什么 POST 變成了 OPTIONS?URL 路徑?jīng)]錯(cuò),為什么又會(huì)返回 404?

POST 變 OPTIONS 問(wèn)題涉及復(fù)雜跨域請(qǐng)求,符合以下任意一個(gè)條件的請(qǐng)求就算復(fù)雜請(qǐng)求:

  1. 使用了除 HEAD、GET、POST之外的請(qǐng)求方法;
  2. 頭部字段不超出 Accept、Accept-Language、Content-Language、Last-Event-ID、Content-Type,并且 Content-Type 的值只限于 application/x-www-form-urlencoded、multipart/form-data、text/plain;

由于設(shè)置的 Authorization 字段,Content-Type 也設(shè)置為了 application/json,因此這個(gè)請(qǐng)求算復(fù)雜跨域請(qǐng)求,會(huì)在正式通信前增加一次 OPTIONS 查詢(xún)請(qǐng)求,稱(chēng)為"預(yù)檢"請(qǐng)求(preflight request),用于向服務(wù)器請(qǐng)求權(quán)限等信息,預(yù)檢請(qǐng)求被成功響應(yīng)后,才會(huì)發(fā)出真實(shí)的 POST 請(qǐng)求。

可為什么 OPTIONS 請(qǐng)求返回 404 呢?
通過(guò)上面的錯(cuò)誤說(shuō)明及分析,答案應(yīng)該很清晰了,就是服務(wù)端路由未對(duì) OPTIONS 類(lèi)型請(qǐng)求做出響應(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) {
  ...
  // 重點(diǎn):此路由僅支持 POST
  group.POST("/signin", userController, "SignIn")
 }
}

/signin 的路由指定了請(qǐng)求方式為 POST,自然無(wú)法響應(yīng)其他類(lèi)型的請(qǐng)求,使用如下方式定義倒是可響應(yīng)所有類(lèi)型的請(qǐng)求:

group.ALL("/signin", userController, "SignIn") 

這樣就使該路由支持所有的請(qǐng)求方法,但需要在控制器的 SignIn 方法中做判斷需要響應(yīng)哪些類(lèi)型的請(qǐng)求,很繁瑣,不推薦此方式。

其實(shí)只要在 CORS 中間件中對(duì) OPTIONS 請(qǐng)求做統(tǒng)一響應(yīng)即可,上代碼:

// CORS 允許接口跨域請(qǐng)求
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 中間件要在全局添加,如果在路由組中添加,同樣會(huì)出現(xiàn) OPTIONS 請(qǐng)求 404 的情況,而且中間件的代碼在請(qǐng)求過(guò)程中未執(zhí)行,原因暫不清楚,還需要多了解下框架。

本文描述的跨域問(wèn)題是在網(wǎng)頁(yè)上使用 Vue + axios 時(shí)出現(xiàn)的,使用 Postman 工具調(diào)試則一切正常,這里記錄下排查過(guò)程和解決方法,希望能幫到有需要的童鞋,有任何問(wèn)題可以在評(píng)論里一起討論下。

到此這篇關(guān)于Vue axios與Go Frame后端框架的Options請(qǐng)求跨域問(wèn)題詳解的文章就介紹到這了,更多相關(guān)Vue axios與Go Frame跨域內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • vue3調(diào)度器scheduler功能和用法詳解

    vue3調(diào)度器scheduler功能和用法詳解

    調(diào)度器是vue3響應(yīng)式系統(tǒng)中一個(gè)非常重要的特性,可調(diào)度性指的是當(dāng)trigger 動(dòng)作觸發(fā)副作用函數(shù)重新執(zhí)行時(shí),有能力決定副作用函數(shù)執(zhí)行的時(shí)機(jī)、次數(shù)以及方式,本文通過(guò)代碼示例給大家介紹調(diào)度器是什么,有什么功能,怎么使用,感興趣的同學(xué)可以借鑒閱讀
    2023-06-06
  • vue.js根據(jù)代碼運(yùn)行環(huán)境選擇baseurl的方法

    vue.js根據(jù)代碼運(yùn)行環(huán)境選擇baseurl的方法

    本篇文章主要介紹了vue.js根據(jù)代碼運(yùn)行環(huán)境選擇baseurl的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-02-02
  • Vue 攔截器對(duì)token過(guò)期處理方法

    Vue 攔截器對(duì)token過(guò)期處理方法

    下面小編就為大家分享一篇Vue 攔截器對(duì)token過(guò)期處理方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-01-01
  • Vue3渲染器與編譯器深入淺析

    Vue3渲染器與編譯器深入淺析

    這篇文章主要為大家介紹了Vue3渲染器與編譯器深入淺析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • Vue.js 使用AntV X6的示例步驟

    Vue.js 使用AntV X6的示例步驟

    X6 是 AntV 旗下的圖編輯引擎,提供了一系列開(kāi)箱即用的交互組件和簡(jiǎn)單易用的節(jié)點(diǎn)定制能力,方便我們快速搭建流程圖、DAG 圖、ER 圖等圖應(yīng)用。接下來(lái)就看看vue如何使用它
    2021-05-05
  • Vue中TypeScript和Pinia使用方法

    Vue中TypeScript和Pinia使用方法

    這篇文章主要介紹了Vue中TypeScript和Pinia使用方法,讓我們來(lái)看一個(gè)簡(jiǎn)單的示例來(lái)演示TypeScript 和 Pinia的強(qiáng)大之處,需要的朋友可以參考下
    2023-07-07
  • 強(qiáng)烈推薦!Vue3.2中的setup語(yǔ)法糖

    強(qiáng)烈推薦!Vue3.2中的setup語(yǔ)法糖

    script?setup是vue3的新語(yǔ)法糖,并不是新增的功能模塊,只是簡(jiǎn)化了以往的組合式API必須返回(return)的寫(xiě)法,并且有更好的運(yùn)行時(shí)性能,這篇文章主要給大家介紹了關(guān)于Vue3.2中setup語(yǔ)法糖的相關(guān)資料,需要的朋友可以參考下
    2021-12-12
  • vue項(xiàng)目中axios請(qǐng)求網(wǎng)絡(luò)接口封裝的示例代碼

    vue項(xiàng)目中axios請(qǐng)求網(wǎng)絡(luò)接口封裝的示例代碼

    這篇文章主要介紹了vue項(xiàng)目中axios請(qǐng)求網(wǎng)絡(luò)接口封裝的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-12-12
  • vue實(shí)現(xiàn)移動(dòng)端table表格簡(jiǎn)單方法

    vue實(shí)現(xiàn)移動(dòng)端table表格簡(jiǎn)單方法

    這篇文章主要給大家介紹了關(guān)于vue實(shí)現(xiàn)移動(dòng)端table表格簡(jiǎn)單方法的相關(guān)資料,使用Vue.js開(kāi)發(fā)移動(dòng)應(yīng)用程序時(shí),經(jīng)常需要使用各種UI組件,其中el-table是一個(gè)常用的表格組件,可以方便地展示數(shù)據(jù),需要的朋友可以參考下
    2023-09-09
  • 基于Vue2實(shí)現(xiàn)印章徽章組件

    基于Vue2實(shí)現(xiàn)印章徽章組件

    這篇文章主要介紹了如何基于vue2實(shí)現(xiàn)簡(jiǎn)單的印章徽章控件,文中通過(guò)示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,需要的朋友們下面就跟隨小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-10-10

最新評(píng)論