使用vue+vue-cli+axios+element-ui開發后台管理系統時,遇到一個問題,后台給了一個接口,我這邊用axios請求數據,控制台總是報405錯誤和跨域錯誤
錯誤 405? 沒見過!! 查了一下資料, 錯誤405表示--用來訪問本頁面的HTTP謂詞不被允許,謂詞指的就是GET、POST 和 HEAD等。說白了就是請求的方法不被允許!可是,我是完全按照后台給的接口文檔寫的啊
this.$http({ method: 'POST', url: 'auth/login', data: { 'username': this.username, 'password': this.password } }).then(res => { console.log(res) }).catch(err => { console.log(err) })
(注:$http是我自己封裝好的axios Vue.prototype.$http = axios)
問題出來哪里呢?
我又看了一下控制台的Network,headers信息顯示如下:
明明寫的是POST請求,怎么到瀏覽器“嘴里”就變成OPTIONS? OPTIONS又是什么東西?
繼續查。。。。 簡單來說,OPTIONS是正式請求之前的一次“預查詢”,瀏覽器先詢問服務器,當前網頁所在的域名是否在服務器的許可名單之中,以及可以使用哪些HTTP動詞和頭信息字段。只有得到肯定答復,瀏覽器才會發出正式的XMLHttpRequest
請求,否則就報錯。
結果顯而易見了,因為存在跨域,瀏覽器先發出一次“預查詢”,查詢不通過,返回HTTP 405 錯誤 ,接着跨域也失敗,返回跨域失敗結果。
怎么解決這個問題呢?
通過查詢資料,vue-cli的proxyTable可以解決跨域.
很簡單,在項目目錄里找到config文件夾,然后找到index.js,找到proxyTable選項
設置成:
proxyTable: { '/api': { target: 'http://baidu.com', pathRewrite: { '^/api': '' }
簡單解釋一下: ‘/api’ 是 url的別名 target指的是要代理的url 其他照着填就好。
在axios使用:
this.$http({ method: 'POST', url: '/api/auth/login', data: { 'username': this.username, 'password': this.password } }).then(res => { console.log(res) }).catch(err => { console.log(err) })
在控制台顯示:
這就搞定了!
----- 2017-06-26 22:30