国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

Vue-cli3.x + axios 跨域方案踩坑指北

2019-11-19 11:13:49
字體:
來源:轉載
供稿:網友

緣起

最近實驗課上需要重構以前寫過的一個項目(垃圾堆),需要添加發生郵件提醒的功能,記得以前寫過一個PHP版的實現,所以想把PHP寫的功能整理成一個服務,然后在前端調用。但是這個項目是JavaWeb,也就是說我需要面對跨域的問題。不過本篇文章,講的并不是如何解決這樣的跨域問題,而是我在找如何解決這個問題的路上遇到的坑。

其實,在前端工程化大行其道的現在,前后端已經分離開來,前端為了提高工作流效率往往自己開一個小型的服務器,就比如webpack.devServer。這樣在前端調用后端接口的時候必然會面臨跨域的問題,如題,Vue-cli 3.x + axios 跨域方案 就是解決這里的跨域問題。這里的跨域是基于webpack的devServer的代理功能(proxy)來實現開發環境中的跨域,也就是說本篇所討論的并不能解決生產環境下的跨域問題,因為webpack.devServer是DevDependencies,一旦打包上線,這個proxy代理就會失效。但是這并不妨礙我們開發中使用跨域來提高開發效率和體驗。

開始填坑

其實這個問題解決起來很簡單,網上也是很多教程,為了文章完整性,我這里也做一個盡量完備的展示,介紹如何配置Vue-cli 3.x來實現跨域 。

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

Vue-cli3.x比Vue-cli2.x構建的項目要簡化很多,根目錄下只有./src和./public文件夾,所以網上很多教程說config目錄下的vue.config.js是說的vue-cli 2.x版本。那么對于Vue-cli 3.x版本,構建也很簡單,直接在根目錄里建一個vue.config.js配置文件就可以了,我們直接看devServer.proxy里的代碼:

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

下面是根據上面的地址需要配置的proxy對象

devServer : {    proxy : {      '/index' : {        target : 'http://localhost/index',        // ws : true,        changeOrigin : true,        pathRewrite : {          '^/index' : ''        }      }    }  }

大部分教程到這里就停止了,但是我在這里做一個擴展,為了讓讀者理解這里的配置是如何起作用的(以下內容整理自http-proxy-middleware的npm描述里,http-proxy-middleware是一個npm模塊,是proxy的底層原理實現)。

     foo://example.com:8042/over/there?name=ferret#nose     /_/  /______________//_________/ /_________/ /__/     |      |      |      |    |    scheme   authority    path    query  fragment

以我上面的配置為例,'/index'這個key在http-proxy-middleware中被稱為context――用來決定哪些請求需要被target對應的主機地址(這里是http://localhost/index)代理,它可以是 字符串,含有通配符的字符串,或是一個數組,分別對應于path matching(路徑匹配)wildcard path matching(通配符路徑匹配)multiple path matching(多路徑匹配),而這里的path指的就是上圖所標識的path段。

簡言之,這個key就是匹配path的,一旦匹配到符合的path,就會把請求轉發的代理主機去,而代理主機的地址就是target字段對應的內容。

那pathRewrit是什么意思呢?意如其名,路徑重寫。就是把模式(這里是^/index)匹配到的path重寫為對應的路徑(這里是'',相當于刪除了這個匹配到的路徑)。除了刪除,還有在原有路徑上添加一個基礎路徑,或是改寫一個路徑的方式,這可以參考http-proxy-middleware的npm描述的option.pathRewrite章節

在Vue中使用axios

這個使用任意一個ajax封裝的庫都是可行的,axios,jquery.ajax或者是vue-resource都是可以的。

在Vue中使用axios,網上有兩種方法,一種是將axios加入Vue的原型里,我更推薦第二種方法:

npm install axios vue-axios
import axios from 'axios';import VueAxios from 'vue-axios';Vue.use(VueAxios,axios);

以我上面的proxy配置為基礎,想要讓代理成功轉發到localhost/index/phpinfo.php,在Vue實例中axios需要這樣寫訪問地址:

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

我們來分析這些代碼整個發揮作用的原理是什么?首先,axios去訪問/index/phpinfo.php,這是個相對地址,所以真實訪問地址其實是localhost:8080/index/phpinfo.php,然而/index/phpinfo.php被我們配置的/index匹配到了 ,所以訪問被proxy代理,那轉發到哪個路徑呢?在pathRewrite中,我們將模式^/index的路徑清除了,所以最終的訪問路徑是 target+pathRewrite+ 剩余的部分 , 這樣也就是 http://localhost/index++/phpinfo.php

坑點

可能出現即使配置了proxy,但是依然沒有任何卵用。

  • 大部分情況是因為你的proxy配置和你的訪問路徑不匹配,或者即使匹配到了,但是轉發出去的地址不對,沒有命中后端給的API
  • 或者看看axios,有沒有使用正確姿勢?
  • 還有一點,或許你看到返回的response里的url依然顯示的是本地主機,但是數據已經正常返回,這是正常的,因為我們訪問的本來就是本地主機,只不過proxy轉發了這個請求到一個新的地址。

后續

本篇只解決了開發環境下的跨域問題,實際線上還不能跨域,目前這里有一些方案:

  1. Nginx反向代理跨域
  2. JSONP
  3. CORS

下一次討論這個跨域問題,嘗試解決。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 莱州市| 新巴尔虎左旗| 福安市| 岳普湖县| 霍山县| 汶上县| 朝阳区| 饶阳县| 西贡区| 临清市| 崇明县| 惠来县| 阿合奇县| 深泽县| 滕州市| 卢湾区| 南平市| 东海县| 疏附县| 绩溪县| 格尔木市| 镇远县| 九台市| 石棉县| 界首市| 西充县| 深圳市| 个旧市| 淮滨县| 六枝特区| 肃宁县| 阿拉善右旗| 商洛市| 贵南县| 三亚市| 崇明县| 望江县| 道孚县| 兴隆县| 宝山区| 临城县|