最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Vue使用vue-recoure + http-proxy-middleware + vuex配合promise實(shí)現(xiàn)基本的跨域請(qǐng)求封裝

 更新時(shí)間:2019年10月21日 11:43:04   作者:HMleilei  
這篇文章主要介紹了Vue使用vue-recoure + http-proxy-middleware + vuex配合promise實(shí)現(xiàn)基本的跨域請(qǐng)求封裝問題,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

使用vue init webpack 你的項(xià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' //用來請(qǐng)求接口
Vue.use(VueResource)
//開啟后請(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的文件夾用來存放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è)文件用來存放請(qǐng)求方法
 Vue.use(VueX);
 //請(qǐng)求之甬道actions所以只導(dǎo)入了actions
 export default new VueX.Store({
  actions
 });

在store文件夾中創(chuàng)建一個(gè)actions.js的文件用來存放請(qǐng)求方法

配置請(qǐng)求代理

在config文件夾下面創(chuàng)建一個(gè)host.js文件用來存放開發(fā)、測(cè)試、生產(chǎn)的請(qǐng)求地址ip

在文件中你可以根據(jù)條件來配置到底是開發(fā)還是測(cè)試或者是正式環(huán)境

let HostType = 0; //用來判斷當(dāng)前是什么環(huán)境
let Host = {}; //用來存儲(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文件用來存放代理的配置

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)求代理是通過服務(wù)器進(jìn)行代理的在啟動(dòng)腳本中會(huì)使用koa框架來注冊(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è)值開頭的
   ctx.respond = false; //繞開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ù)雜的寫法了
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");
})

代理配置好以后就可以寫請(qǐng)求方法了,在創(chuàng)建好的store文件夾下面的actions文件里編寫請(qǐng)方法

//導(dǎo)入Vue
import Vue from "vue"
export default {
 //測(cè)試接口
 testInterface({},postdata) {
  //postdata是你調(diào)用的時(shí)候傳過來的參數(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)來

import {mapActions} from "vuex";

在methods中創(chuàng)建一個(gè)方法用來發(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.方法名就可以訪問到vuex中的actions方法;這里使用的是輔助函數(shù),也可以使用原始方法

在終端中使用node 啟動(dòng)腳本文件的名稱 或者使用 nodemon 啟動(dòng)腳本文件的名稱

在瀏覽器中打開服務(wù)的地址點(diǎn)擊我們創(chuàng)建的按鈕查看請(qǐng)求接口

可以看到我們的代理是請(qǐng)求成功的;狀態(tài)之所以是304是因?yàn)榈诙握?qǐng)求的時(shí)候如果請(qǐng)求沒有發(fā)生改變就會(huì)使用瀏覽器緩存;

上面遺留了一個(gè)bug就是這個(gè)方法只適用于build后的項(xiàng)目;在開發(fā)中每次都build無疑浪費(fèi)了很多時(shí)間,下面就來在開發(fā)環(huán)境中使用服務(wù)器代理的方式完成跨域請(qǐng)求

如果是cli創(chuàng)建的項(xiàng)目直接在config文件夾下面的index文件中的proxyTable進(jìn)行添加就可以了

相關(guān)文章

  • Vue使用自定義指令實(shí)現(xiàn)拖拽行為實(shí)例分析

    Vue使用自定義指令實(shí)現(xiàn)拖拽行為實(shí)例分析

    這篇文章主要介紹了Vue使用自定義指令實(shí)現(xiàn)拖拽行為,結(jié)合實(shí)例形式分析了Vue使用自定義指令實(shí)現(xiàn)拖拽行為具體步驟、原理與操作注意事項(xiàng),需要的朋友可以參考下
    2020-06-06
  • Vue自定義指令結(jié)合阿里云OSS優(yōu)化圖片的實(shí)現(xiàn)方法

    Vue自定義指令結(jié)合阿里云OSS優(yōu)化圖片的實(shí)現(xiàn)方法

    這篇文章主要介紹了Vue自定義指令結(jié)合阿里云OSS優(yōu)化圖片的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • 使用element-ui,el-row中的el-col數(shù)據(jù)為空頁面布局變亂問題

    使用element-ui,el-row中的el-col數(shù)據(jù)為空頁面布局變亂問題

    這篇文章主要介紹了使用element-ui,el-row中的el-col數(shù)據(jù)為空頁面布局變亂問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • vue?如何綁定disabled屬性讓其不能被點(diǎn)擊

    vue?如何綁定disabled屬性讓其不能被點(diǎn)擊

    這篇文章主要介紹了vue?如何綁定disabled屬性讓其不能被點(diǎn)擊,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • vue基于Element按鈕權(quán)限實(shí)現(xiàn)方案

    vue基于Element按鈕權(quán)限實(shí)現(xiàn)方案

    這篇文章主要介紹了vue基于Element按鈕權(quán)限實(shí)現(xiàn)方案,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • 基于axios 解決跨域cookie丟失的問題

    基于axios 解決跨域cookie丟失的問題

    今天小編就為大家分享一篇基于axios 解決跨域cookie丟失的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-09-09
  • Vue.js實(shí)現(xiàn)簡(jiǎn)單動(dòng)態(tài)數(shù)據(jù)處理

    Vue.js實(shí)現(xiàn)簡(jiǎn)單動(dòng)態(tài)數(shù)據(jù)處理

    本篇文章主要介紹了Vue.js實(shí)現(xiàn)簡(jiǎn)單動(dòng)態(tài)數(shù)據(jù)處理,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-02-02
  • Vue Mixins混入介紹與使用

    Vue Mixins混入介紹與使用

    如果我們?cè)诿總€(gè)組件中去重復(fù)定義這些屬性和方法會(huì)使得項(xiàng)目出現(xiàn)代碼冗余并提高了維護(hù)難度,針對(duì)這種情況官方提供了Mixins特性,這時(shí)使用Vue mixins混入有很大好處,下面就介紹下Vue mixins混入使用方法,需要的朋友參考下吧
    2023-02-02
  • Springboot+Vue-Cropper實(shí)現(xiàn)頭像剪切上傳效果

    Springboot+Vue-Cropper實(shí)現(xiàn)頭像剪切上傳效果

    這篇文章主要為大家詳細(xì)介紹了Springboot+Vue-Cropper實(shí)現(xiàn)頭像剪切上傳效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • vue高級(jí)組件之provide與inject使用及說明

    vue高級(jí)組件之provide與inject使用及說明

    這篇文章主要介紹了vue高級(jí)組件之provide與inject使用及說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04

最新評(píng)論

雷州市| 河津市| 迭部县| 新泰市| 清水河县| 龙游县| 阳信县| 长兴县| 白河县| 宜春市| 开平市| 阿巴嘎旗| 思南县| 芒康县| 平阳县| 宜宾市| 敖汉旗| 郯城县| 内丘县| 手游| 页游| 微博| 宣武区| 吉安县| 福海县| 永丰县| 阳泉市| 平邑县| 北宁市| 拉萨市| 庐江县| 乌什县| 东乡族自治县| 乌兰县| 图们市| 浮梁县| 泸州市| 二连浩特市| 隆回县| 呼玛县| 五河县|