Vue 3.x+axios跨域方案的踩坑指南

最近實(shí)驗(yàn)課上需要重構(gòu)以前寫過(guò)的一個(gè)項(xiàng)目(垃圾堆)晨汹,需要添加發(fā)生郵件提醒的功能镜撩,記得以前寫過(guò)一個(gè)PHP版的實(shí)現(xiàn)旧巾,所以想把PHP寫的功能整理成一個(gè)服務(wù),然后在前端調(diào)用蜕劝。但是這個(gè)項(xiàng)目是JavaWeb檀头,也就是說(shuō)我需要面對(duì)跨域的問(wèn)題。不過(guò)本篇文章熙宇,講的并不是如何解決這樣的跨域問(wèn)題鳖擒,而是我在找如何解決這個(gè)問(wèn)題的路上遇到的坑溉浙。

其實(shí)烫止,在前端工程化大行其道的現(xiàn)在,前后端已經(jīng)分離開(kāi)來(lái)戳稽,前端為了提高工作流效率往往自己開(kāi)一個(gè)小型的服務(wù)器馆蠕,就比如webpack.devServer期升。這樣在前端調(diào)用后端接口的時(shí)候必然會(huì)面臨跨域的問(wèn)題,

如題互躬,Vue3.x + axios 跨域方案 就是解決這里的跨域問(wèn)題播赁。這里的跨域是基于webpack的devServer的代理功能(proxy)來(lái)實(shí)現(xiàn)開(kāi)發(fā)環(huán)境中的跨域,也就是說(shuō)本篇所討論的并不能解決生產(chǎn)環(huán)境下的跨域問(wèn)題吼渡,因?yàn)閣ebpack.devServer是DevDependencies容为,一旦打包上線,這個(gè)proxy代理就會(huì)失效寺酪。但是這并不妨礙我們開(kāi)發(fā)中使用跨域來(lái)提高開(kāi)發(fā)效率和體驗(yàn)坎背。

開(kāi)始填坑

其實(shí)這個(gè)問(wèn)題解決起來(lái)很簡(jiǎn)單,網(wǎng)上也是很多教程寄雀,為了文章完整性得滤,我這里也做一個(gè)盡量完備的展示,介紹如何配置Vue3.x來(lái)實(shí)現(xiàn)跨域 盒犹。

vue.config.js中devServer.proxy的配置解析

Vue3.x的CLI工具比Vue2.x的CLI工具構(gòu)建的項(xiàng)目要簡(jiǎn)化很多懂更,根目錄下只有./src和./public文件夾泣栈,所以網(wǎng)上很多教程說(shuō)config目錄下的vue.config.js是說(shuō)的vue2.x版本维贺。那么對(duì)于Vue3.x版本茎芭,構(gòu)建也很簡(jiǎn)單雀鹃,直接在根目錄里建一個(gè)vue.config.js配置文件就可以了拣帽,我們直接看devServer.proxy里的代碼:

我這里devServer的地址是:localhost:8080/烫葬,需要代理的地址是:localhost/index/phpinfo.php (我自己寫的一個(gè)測(cè)試跨域用的php荷辕,返回一個(gè)‘ok')

下面是根據(jù)上面的地址需要配置的proxy對(duì)象

devServer : {

proxy : {

'/index' : {

target : 'http://localhost/index',

// ws : true,

changeOrigin : true,

pathRewrite : {

'^/index' : ''

}

}

}

}

大部分教程到這里就停止了昧甘,但是我在這里做一個(gè)擴(kuò)展命黔,為了讓讀者理解這里的配置是如何起作用的(以下內(nèi)容整理自http-proxy-middleware的npm描述里呜呐,http-proxy-middleware是一個(gè)npm模塊,是proxy的底層原理實(shí)現(xiàn))悍募。

foo://example.com:8042/over/there?name=ferret#nose

\_/?? \______________/\_________/ \_________/ \__/

|?????????? |??????????? |??????????? |??????? |

scheme???? authority?????? path??????? query?? fragment

以我上面的配置為例蘑辑,'/index'這個(gè)key在http-proxy-middleware中被稱為context――用來(lái)決定哪些請(qǐng)求需要被target對(duì)應(yīng)的主機(jī)地址(這里是http://localhost/index)代理,它可以是 字符串坠宴,含有通配符的字符串洋魂,或是一個(gè)數(shù)組,分別對(duì)應(yīng)于path matching(路徑匹配)wildcard path matching(通配符路徑匹配)multiple path matching(多路徑匹配)喜鼓,而這里的path指的就是上圖所標(biāo)識(shí)的path段副砍。

簡(jiǎn)言之,這個(gè)key就是匹配path的庄岖,一旦匹配到符合的path豁翎,就會(huì)把請(qǐng)求轉(zhuǎn)發(fā)的代理主機(jī)去,而代理主機(jī)的地址就是target字段對(duì)應(yīng)的內(nèi)容隅忿。

那pathRewrit是什么意思呢心剥?意如其名邦尊,路徑重寫。就是把模式(這里是^/index)匹配到的path重寫為對(duì)應(yīng)的路徑(這里是''优烧,相當(dāng)于刪除了這個(gè)匹配到的路徑)蝉揍。除了刪除,還有在原有路徑上添加一個(gè)基礎(chǔ)路徑畦娄,或是改寫一個(gè)路徑的方式又沾,這可以參考http-proxy-middleware的npm描述的option.pathRewrite章節(jié)?。

在Vue中使用axios

這個(gè)使用任意一個(gè)ajax封裝的庫(kù)都是可行的熙卡,axios捍掺,jquery.ajax或者是vue-resource都是可以的。

在Vue中使用axios再膳,網(wǎng)上有兩種方法挺勿,一種是將axios加入Vue的原型里,我更推薦第二種方法:

npm install axios vue-axios

import axios from 'axios';

import VueAxios from 'vue-axios';

Vue.use(VueAxios,axios);

以我上面的proxy配置為基礎(chǔ)喂柒,想要讓代理成功轉(zhuǎn)發(fā)到localhost/index/phpinfo.php不瓶,在Vue實(shí)例中axios需要這樣寫訪問(wèn)地址:

this.axios.get('/index/phpinfo.php').then((res)=>{

console.log(res);

})

我們來(lái)分析這些代碼整個(gè)發(fā)揮作用的原理是什么?首先灾杰,axios去訪問(wèn)/index/phpinfo.php蚊丐,這是個(gè)相對(duì)地址,所以真實(shí)訪問(wèn)地址其實(shí)是localhost:8080/index/phpinfo.php艳吠,然而/index/phpinfo.php被我們配置的/index匹配到了 麦备,所以訪問(wèn)被proxy代理,那轉(zhuǎn)發(fā)到哪個(gè)路徑呢昭娩?在pathRewrite中凛篙,我們將模式^/index的路徑清除了,所以最終的訪問(wèn)路徑是 target+pathRewrite+ 剩余的部分 栏渺, 這樣也就是 http://localhost/index++/phpinfo.php

坑點(diǎn)

可能出現(xiàn)即使配置了proxy呛梆,但是依然沒(méi)有任何卵用。

大部分情況是因?yàn)槟愕膒roxy配置和你的訪問(wèn)路徑不匹配磕诊,或者即使匹配到了填物,但是轉(zhuǎn)發(fā)出去的地址不對(duì),沒(méi)有命中后端給的API

或者看看axios霎终,有沒(méi)有使用正確姿勢(shì)滞磺?

還有一點(diǎn),或許你看到返回的response里的url依然顯示的是本地主機(jī)莱褒,但是數(shù)據(jù)已經(jīng)正常返回击困,這是正常的,因?yàn)槲覀冊(cè)L問(wèn)的本來(lái)就是本地主機(jī)保礼,只不過(guò)proxy轉(zhuǎn)發(fā)了這個(gè)請(qǐng)求到一個(gè)新的地址沛励。

后續(xù)

本篇只解決了開(kāi)發(fā)環(huán)境下的跨域問(wèn)題,實(shí)際線上還不能跨域炮障,目前這里有一些方案:

Nginx反向代理跨域

JSONP

CORS


文章同步發(fā)布:?https://www.geek-share.com/detail/2783995081.html

參考文章:

vue-cli 3.x 配置Axios(proxyTable)跨域代理方法

Vue.js 中 axios 跨域訪問(wèn)錯(cuò)誤問(wèn)題及解決方法

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末目派,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子胁赢,更是在濱河造成了極大的恐慌企蹭,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件智末,死亡現(xiàn)場(chǎng)離奇詭異谅摄,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)系馆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門送漠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人由蘑,你說(shuō)我怎么就攤上這事闽寡。” “怎么了尼酿?”我有些...
    開(kāi)封第一講書人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵爷狈,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我裳擎,道長(zhǎng)涎永,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任鹿响,我火速辦了婚禮羡微,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘惶我。我一直安慰自己拷淘,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布指孤。 她就那樣靜靜地躺著启涯,像睡著了一般。 火紅的嫁衣襯著肌膚如雪恃轩。 梳的紋絲不亂的頭發(fā)上结洼,一...
    開(kāi)封第一講書人閱讀 51,763評(píng)論 1 307
  • 那天,我揣著相機(jī)與錄音叉跛,去河邊找鬼松忍。 笑死,一個(gè)胖子當(dāng)著我的面吹牛筷厘,可吹牛的內(nèi)容都是我干的鸣峭。 我是一名探鬼主播宏所,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼摊溶!你這毒婦竟也來(lái)了爬骤?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤莫换,失蹤者是張志新(化名)和其女友劉穎霞玄,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體拉岁,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡坷剧,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了喊暖。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片惫企。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖陵叽,靈堂內(nèi)的尸體忽然破棺而出雅任,到底是詐尸還是另有隱情,我是刑警寧澤咨跌,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布沪么,位于F島的核電站,受9級(jí)特大地震影響锌半,放射性物質(zhì)發(fā)生泄漏禽车。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一刊殉、第九天 我趴在偏房一處隱蔽的房頂上張望殉摔。 院中可真熱鬧,春花似錦记焊、人聲如沸逸月。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)碗硬。三九已至,卻和暖如春瓢颅,著一層夾襖步出監(jiān)牢的瞬間恩尾,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工挽懦, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留翰意,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像冀偶,于是被迫代替她去往敵國(guó)和親醒第。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容