// axios 中的GET請(qǐng)求
axios.get('/user', {
params: {
ID: ‘001’
}
})
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
});
// axios 中的POST請(qǐng)求
axios.post('/user', {
firstName: '1',
lastName: '2'
})
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
});
方案1:既然使用axios直接進(jìn)行跨域訪問不可行,我們就需要配置代理了。代理可以解決的原因:因?yàn)榭蛻舳苏?qǐng)求服務(wù)端的數(shù)據(jù)是存在跨域問題的,而服務(wù)器和服務(wù)器之間可以相互請(qǐng)求數(shù)據(jù),是沒有跨域的概念(如果服務(wù)器沒有設(shè)置禁止跨域的權(quán)限問題),也就是說,我們可以配置一個(gè)代理的服務(wù)器可以請(qǐng)求另一個(gè)服務(wù)器中的數(shù)據(jù),然后把請(qǐng)求出來的數(shù)據(jù)返回到我們的代理服務(wù)器中,代理服務(wù)器再返回?cái)?shù)據(jù)給我們的客戶端,這樣我們就可以實(shí)現(xiàn)跨域訪問數(shù)據(jù)。
成都創(chuàng)新互聯(lián)公司專注于圖們網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供圖們營(yíng)銷型網(wǎng)站建設(shè),圖們網(wǎng)站制作、圖們網(wǎng)頁設(shè)計(jì)、圖們網(wǎng)站官網(wǎng)定制、微信平臺(tái)小程序開發(fā)服務(wù),打造圖們網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供圖們網(wǎng)站排名全網(wǎng)營(yíng)銷落地服務(wù)。
準(zhǔn)備工作:安裝所需中間件和插件等,比如axios,http-proxy-middleware等。
具體案例:這里以訪問豆瓣Top250為例,直接訪問如下:
axios.get("http://api.douban.com/v2/movie/top250")
.then(res=>{
console.log(res)
})
.catch(err=>{
console.log(err)
})
當(dāng)執(zhí)行npm run dev時(shí),控制臺(tái)報(bào)錯(cuò)如下:
事實(shí)證明直接請(qǐng)求確實(shí)出現(xiàn)跨域問題了,下面具體演示解決跨域問題的步驟:
上面所說的必備條件都已安裝完成的情況下,執(zhí)行以下步驟即可解決問題:
1.配置BaseUrl
在main.js中,配置數(shù)據(jù)所在服務(wù)器的前綴(即固定部分),代碼如下:
// 項(xiàng)目入口,配置全局vue
import Vue from 'vue'
import VueRouter from './router/routes.js'
import Store from './store/index.js'
import './assets/less/index.less'
import App from './App.vue'
import ElementUI from 'element-ui'
import 'element-ui/lib/theme-default/index.css'
import axios from 'axios'
Vue.prototype.$axios = axios
axios.defaults.baseURL = '/api' //關(guān)鍵代碼
Vue.config.productionTip = false
Vue.use(ElementUI);
new Vue({
router:VueRouter,
store:Store,
template:' ',
components: {App}
}).$mount('#app')
// 默認(rèn)進(jìn)入商品模塊
// VueRouter.push({ path: '/home' })
關(guān)鍵代碼:axios.defaults.baseURL = '/api',作用是我們每次發(fā)送的請(qǐng)求都會(huì)帶一個(gè)/api的前綴。
2.配置代理
在config文件夾下的index.js文件中的proxyTable字段中,作如下處理:
dev: {
env: require('./dev.env'),
port: 8090,
autoOpenBrowser: true,
assetsSubDirectory: 'static',
assetsPublicPath: '/',
proxyTable: {
'/api': {
target:'http://api.douban.com/v2', // 你請(qǐng)求的第三方接口
changeOrigin:true, // 在本地會(huì)創(chuàng)建一個(gè)虛擬服務(wù)端,然后發(fā)送請(qǐng)求的數(shù)據(jù),并同時(shí)接收請(qǐng)求的數(shù)據(jù),這樣服務(wù)端和服務(wù)端進(jìn)行數(shù)據(jù)的交互就不會(huì)有跨域問題
pathRewrite:{ // 路徑重寫,
'^/api': '' // 替換target中的請(qǐng)求地址,也就是說以后你在請(qǐng)求http://api.douban.com/v2/XXXXX這個(gè)地址的時(shí)候直接寫成/api即可。
}
}
},
// CSS Sourcemaps off by default because relative paths are "buggy"
// with this option, according to the CSS-Loader README
// (https://github.com/webpack/css-loader#sourcemaps)
// In our experience, they generally work as expected,
// just be aware of this issue when enabling this option.
cssSourceMap: false
}
3.在具體使用axios的地方,修改url如下即可:
axios.get("/movie/top250").then((res) => {
res = res.data
if (res.errno === ERR_OK) {
this.themeList=res.data;
}
}).catch((error) => {
console.warn(error)
})
4.重新啟動(dòng)項(xiàng)目之后,已經(jīng)解決了跨域問題,結(jié)果如下:
【注意】:必須重啟項(xiàng)目!!
原理:
因?yàn)槲覀兘ourl加上了前綴/api,我們?cè)L問/movie/top250就當(dāng)于訪問了:localhost:8080/api/movie/top250(其中l(wèi)ocalhost:8080是默認(rèn)的IP和端口)。
在index.js中的proxyTable中攔截了/api,并把/api及其前面的所有替換成了target中的內(nèi)容,因此實(shí)際訪問Url是http://api.douban.com/v2/movie/top250。
至此,純前端配置代理解決axios跨域得到解決。
根據(jù)評(píng)論區(qū)內(nèi)容,區(qū)分一下生產(chǎn)環(huán)境和開發(fā)環(huán)境,集體配置如下:
1.在config文件夾里面創(chuàng)建一個(gè)api.config.js的配置文件
const isPro = Object.is(process.env.NODE_ENV, 'production')
console.log(isPro);
module.exports = {
baseUrl: isPro ? 'https://www.***/index.php/Official(線上地址)' : 'api/'
}
2.在main.js文件里面引入上面文件,這樣就可以保證動(dòng)態(tài)的匹配生產(chǎn)和開發(fā)環(huán)境的定義前綴了,代碼如下:
import Vue from 'vue'
import App from './App'
import router from './router'
import 'bootstrap/dist/js/bootstrap.min'
import 'bootstrap/dist/css/bootstrap.min.css'
import axios from 'axios'
import apiConfig from '../config/api.config'
Vue.prototype.$axios = axios;
Vue.config.productionTip = false;
axios.defaults.baseURL = apiConfig.baseUrl;// 配置接口地址
axios.defaults.withCredentials = false;
以上兩步即可解決vue的跨域問題,并且可以可以直接build打包到線上。