Vue使用vue-recoure + http-proxy-middleware + vuex配合promise實(shí)現(xiàn)基本的跨域請(qǐng)求封裝
使用vue init webpack 你的項(xiàng)目名稱(chēng)初始化一個(gè)vue的項(xiàng)目
- 安裝依賴
npm install vue-resource http-proxy-middleware vuex koa
- 在項(xiàng)目的main.js中引入并注冊(cè)下載的依賴
- 在main.js中引入vue-resource并注冊(cè)到vue實(shí)例中
import VueResource from 'vue-resource' //用來(lái)請(qǐng)求接口 Vue.use(VueResource) //開(kāi)啟后請(qǐng)求就會(huì)以application/x-www-form-urlencoded作為MIME type 就像普通的html表單一樣,form形式傳給后臺(tái),而非JSON Vue.http.options.emulateJSON = true;
在main.js文件同級(jí)創(chuàng)建一個(gè)store的文件夾用來(lái)存放vuex的文件
在store文件夾中創(chuàng)建一個(gè)index.js的文件(vue在查找時(shí)會(huì)自動(dòng)查找這個(gè)文件),在文件中創(chuàng)建store實(shí)例并導(dǎo)出
import Vue from 'vue' import VueX from 'vuex' import actions from './actions' //這里為了可擴(kuò)展性,所以單獨(dú)創(chuàng)建一個(gè)文件用來(lái)存放請(qǐng)求方法 Vue.use(VueX); //請(qǐng)求之甬道actions所以只導(dǎo)入了actions export default new VueX.Store({ actions });
在store文件夾中創(chuàng)建一個(gè)actions.js的文件用來(lái)存放請(qǐng)求方法
配置請(qǐng)求代理
在config文件夾下面創(chuàng)建一個(gè)host.js文件用來(lái)存放開(kāi)發(fā)、測(cè)試、生產(chǎn)的請(qǐng)求地址ip
在文件中你可以根據(jù)條件來(lái)配置到底是開(kāi)發(fā)還是測(cè)試或者是正式環(huán)境
let HostType = 0; //用來(lái)判斷當(dāng)前是什么環(huán)境 let Host = {}; //用來(lái)存儲(chǔ)當(dāng)前環(huán)境的請(qǐng)求ip if (HostType == 0) { Host = { //對(duì)象內(nèi)的字段可以自定義如果整個(gè)項(xiàng)目只有一個(gè)后臺(tái)地址只需要一個(gè)字段就可以; api: "127.0.0.1:9000", base: "", fileUp: "" } } else if (HostType == 1) { Host = { ... } } else if (HostType == 2) { Host = { ... } } module.exports = Host;
在config文件夾下面創(chuàng)建一個(gè)proxy-table.js文件用來(lái)存放代理的配置
const HOST = require("./HOST.js"); module.exports = { //接口代理 "/api/text": { target: HOST.api, //需要代理到那個(gè)地址 changeOrigin: true //是否跨域 }, "/api/demo": { target: HOST.api, changeOrigin: true } }
在config文件夾下面創(chuàng)建一個(gè)proxy-middleware.js憑借代理和注冊(cè)
//導(dǎo)入插件 const proxyMiddleware = require("http-proxy-middleware"); //導(dǎo)入代理的配置 const proxyTable = require("./proxy-table"); //拿出配置代理的所有匹配的字段 const proxyContext = Object.keys(proxyTable); // ["/api/text","/api/demo"] module.exports = () => { //創(chuàng)建一個(gè)默認(rèn)的配置對(duì)象 const defautOptions = { changeOrigin: true, secure: false } //為什么return的是一個(gè)async的方法是因?yàn)檎?qǐng)求代理是通過(guò)服務(wù)器進(jìn)行代理的在啟動(dòng)腳本中會(huì)使用koa框架來(lái)注冊(cè)這個(gè)中間件 return async (ctx, next) => { //ctx和next都是koa框架中間件自帶的參數(shù) for (let context of proxyContext) { //循環(huán)我們拿到的keys數(shù)組 if (ctx.url.startsWith(context)) { //判斷當(dāng)前請(qǐng)求的url中是不是以拿到的keys數(shù)組中的某個(gè)值開(kāi)頭的 ctx.respond = false; //繞開(kāi)koa框架的內(nèi)置response處理 let options = proxyTable[context]; //如果拿取到的直接是IP地址就賦值給配置對(duì)象 if (typeof options === 'string') { options = { target: options } } //使用Object.assign()方法合并兩個(gè)對(duì)象 options = Object.assign({},defautOptions,options); //將每一個(gè)代理都注冊(cè),這里必須return一個(gè)自執(zhí)行函數(shù)否則代理不會(huì)設(shè)置成功 proxyMiddleware(context,options)(ctx.req,ctx.res, next); } } await next(); } }
在項(xiàng)目的更目錄中創(chuàng)建一個(gè)服務(wù)啟動(dòng)的文件腳本名字自定義
//在腳本文件中導(dǎo)入我們需要的框架和代理配置文件 const Koa = require("koa"); //所用的框架 const proxy = require("./config/proxy-middleware"); //剛才創(chuàng)建的代理配置文件 //創(chuàng)建一個(gè)服務(wù) const app = new Koa(); //將代理插件注冊(cè)到服務(wù)上 app.use(proxy()); //因?yàn)槲覀儗?dǎo)出的是一個(gè)方法所以需要使用調(diào)用的方式注冊(cè) //啟動(dòng)服務(wù) app.listen(9000,() => { console.log("server running at http://127.0.0.1:9000"); }); //對(duì)koa框架不是熟悉的可以使用express框架 如果使用express框架拿代理就不用使用前面那樣復(fù)雜的寫(xiě)法了 const express = require("express"); const proxy = require("http-proxy-middleware"); const app = express(); app.use(express.static("dist/")); app.use("/all", proxy({ target: "http://127.0.0.1:3000", changeOrigin: true, })) app.listen(9000, (err) => { if (err) return console.log(err); console.log("app as running at http://127.0.0.1:9000"); })
代理配置好以后就可以寫(xiě)請(qǐng)求方法了,在創(chuàng)建好的store文件夾下面的actions文件里編寫(xiě)請(qǐng)方法
//導(dǎo)入Vue import Vue from "vue" export default { //測(cè)試接口 testInterface({},postdata) { //postdata是你調(diào)用的時(shí)候傳過(guò)來(lái)的參數(shù)可以更具需求拼接接口 //let ipstr = `/api/text?id=${postdata.id}`; //return Vue.http.get(ipstr,{}).then(response => { return Vue.http.get("/api/text",{}).then(response => { if (response.status == 200) { return new Promise(response.body); } else { return new Promise(response.data.message); } }) } }
測(cè)試代理是否成功
<div id="app"> <button @click="clickF">按鈕</button> </div>
首先在script標(biāo)簽里面將vuex導(dǎo)入進(jìn)來(lái)
import {mapActions} from "vuex";
在methods中創(chuàng)建一個(gè)方法用來(lái)發(fā)送請(qǐng)求,并在methods的最下面使用結(jié)構(gòu)函數(shù)將我們存在vuex中的請(qǐng)求方法按需導(dǎo)入
methods: { clickF() { this.testInterface().then(data=> { console.log(data); }) }, ...mapActions(["testInterface"]) }
直接使用this.方法名就可以訪問(wèn)到vuex中的actions方法;這里使用的是輔助函數(shù),也可以使用原始方法
在終端中使用node 啟動(dòng)腳本文件的名稱(chēng) 或者使用 nodemon 啟動(dòng)腳本文件的名稱(chēng)
在瀏覽器中打開(kāi)服務(wù)的地址點(diǎn)擊我們創(chuàng)建的按鈕查看請(qǐng)求接口
可以看到我們的代理是請(qǐng)求成功的;狀態(tài)之所以是304是因?yàn)榈诙握?qǐng)求的時(shí)候如果請(qǐng)求沒(méi)有發(fā)生改變就會(huì)使用瀏覽器緩存;
上面遺留了一個(gè)bug就是這個(gè)方法只適用于build后的項(xiàng)目;在開(kāi)發(fā)中每次都build無(wú)疑浪費(fèi)了很多時(shí)間,下面就來(lái)在開(kāi)發(fā)環(huán)境中使用服務(wù)器代理的方式完成跨域請(qǐng)求
如果是cli創(chuàng)建的項(xiàng)目直接在config文件夾下面的index文件中的proxyTable進(jìn)行添加就可以了
相關(guān)文章
Vue封裝通過(guò)API調(diào)用的組件的方法詳解
在日常業(yè)務(wù)開(kāi)發(fā)中我們會(huì)經(jīng)常封裝一些業(yè)務(wù)組件,下面這篇文章主要給大家介紹了關(guān)于Vue封裝通過(guò)API調(diào)用的組件的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-12-12vue中的attribute和property的具體使用及區(qū)別
本文主要介紹了vue中的attribute和property的具體使用及區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09Vue過(guò)濾器與內(nèi)置指令和自定義指令及組件使用詳解
這篇文章主要介紹了Vue過(guò)濾器與內(nèi)置指令和自定義指令及組件使用方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2022-12-12Vue3手動(dòng)清理keep-alive組件緩存的方法詳解
這篇文章主要為大家詳細(xì)介紹了Vue3中手動(dòng)清理keep-alive組件緩存的方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-04-04vue如何在項(xiàng)目中調(diào)用騰訊云的滑動(dòng)驗(yàn)證碼
這篇文章主要介紹了vue如何在項(xiàng)目中調(diào)用騰訊云的滑動(dòng)驗(yàn)證碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07vue中進(jìn)入詳情頁(yè)記住滾動(dòng)位置的方法(keep-alive)
今天小編就為大家分享一篇vue中進(jìn)入詳情頁(yè)記住滾動(dòng)位置的方法(keep-alive),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-09-09vue設(shè)計(jì)與實(shí)現(xiàn)合理的觸發(fā)響應(yīng)
這篇文章主要為大家介紹了vue設(shè)計(jì)與實(shí)現(xiàn)合理的觸發(fā)響應(yīng)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08