• 使用vue init webpack 你的项目名称初始化一个vue的项目
  • 安装依赖 npm install vue-resource http-proxy-middleware vuex koa
  • 在项目的main.js中引入并注册下载的依赖
    • 在main.js中引入vue-resource并注册到vue实例中
import VueResource from 'vue-resource'  //用来请求接口
Vue.use(VueResource)
//开启后请求就会以application/x-www-form-urlencoded作为MIME type 就像普通的html表单一样,form形式传给后台,而非JSON
Vue.http.options.emulateJSON = true;
  • 在main.js文件同级创建一个store的文件夹用来存放vuex的文件
  • 在store文件夹中创建一个index.js的文件(vue在查找时会自动查找这个文件),在文件中创建store实例并导出
   import Vue from 'vue'
import VueX from 'vuex'
import actions from './actions' //这里为了可扩展性,所以单独创建一个文件用来存放请求方法 Vue.use(VueX);
//请求之甬道actions所以只导入了actions
export default new VueX.Store({
actions
});
  • 在store文件夹中创建一个actions.js的文件用来存放请求方法

  • 配置请求代理

    • 在config文件夹下面创建一个host.js文件用来存放开发、测试、生产的请求地址ip

    • 在文件中你可以根据条件来配置到底是开发还是测试或者是正式环境
    • let HostType = 0;  //用来判断当前是什么环境
      let Host = {}; //用来存储当前环境的请求ip
      if (HostType == 0) {
      Host = { //对象内的字段可以自定义如果整个项目只有一个后台地址只需要一个字段就可以;
      api: "127.0.0.1:9000",
      base: "",
      fileUp: ""
      }
      } else if (HostType == 1) {
      Host = {
      ...
      }
      } else if (HostType == 2) {
      Host = {
      ...
      }
      }
      module.exports = Host;
    • 在config文件夹下面创建一个proxy-table.js文件用来存放代理的配置
      const HOST = require("./HOST.js");
      
      module.exports = {
      //接口代理
      "/api/text": {
      target: HOST.api, //需要代理到那个地址
      changeOrigin: true //是否跨域
      },
      "/api/demo": {
      target: HOST.api,
      changeOrigin: true
      }
      }
    • 在config文件夹下面创建一个proxy-middleware.js凭借代理和注册
      //导入插件
      const proxyMiddleware = require("http-proxy-middleware");
      //导入代理的配置
      const proxyTable = require("./proxy-table");
      //拿出配置代理的所有匹配的字段
      const proxyContext = Object.keys(proxyTable); // ["/api/text","/api/demo"] module.exports = () => {
      //创建一个默认的配置对象
      const defautOptions = {
      changeOrigin: true,
      secure: false
      }
      //为什么return的是一个async的方法是因为请求代理是通过服务器进行代理的在启动脚本中会使用koa框架来注册这个中间件
      return async (ctx, next) => { //ctx和next都是koa框架中间件自带的参数
      for (let context of proxyContext) { //循环我们拿到的keys数组
      if (ctx.url.startsWith(context)) { //判断当前请求的url中是不是以拿到的keys数组中的某个值开头的
      ctx.respond = false; //绕开koa框架的内置response处理
      let options = proxyTable[context];
      //如果拿取到的直接是IP地址就赋值给配置对象
      if (typeof options === 'string') {
      options = {
      target: options
      }
      }
      //使用Object.assign()方法合并两个对象
      options = Object.assign({},defautOptions,options);
      //将每一个代理都注册,这里必须return一个自执行函数否则代理不会设置成功
      proxyMiddleware(context,options)(ctx.req,ctx.res, next);
      }
      }
      await next();
      }
      }
    • 在项目的更目录中创建一个服务启动的文件脚本名字自定义
    • //在脚本文件中导入我们需要的框架和代理配置文件
      const Koa = require("koa"); //所用的框架
      const proxy = require("./config/proxy-middleware"); //刚才创建的代理配置文件
      //创建一个服务
      const app = new Koa(); //将代理插件注册到服务上
      app.use(proxy()); //因为我们导出的是一个方法所以需要使用调用的方式注册 //启动服务
      app.listen(9000,() => {
      console.log("server running at http://127.0.0.1:9000");
      }); //对koa框架不是熟悉的可以使用express框架 如果使用express框架拿代理就不用使用前面那样复杂的写法了
      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");
      })
    • 代理配置好以后就可以写请求方法了,在创建好的store文件夹下面的actions文件里编写请方法
    • //导入Vue
      import Vue from "vue"
      export default {
      //测试接口
      testInterface({},postdata) {
      //postdata是你调用的时候传过来的参数可以更具需求拼接接口
      //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);
      }
      })
      }
      }
    • 测试代理是否成功
    • <div id="app">
      <button @click="clickF">按钮</button>
      </div>
    • 首先在script标签里面将vuex导入进来
    • import {mapActions} from "vuex";
    • 在methods中创建一个方法用来发送请求,并在methods的最下面使用结构函数将我们存在vuex中的请求方法按需导入
    • methods: {
      clickF() {
      this.testInterface().then(data=> {
      console.log(data);
      })
      },
      ...mapActions(["testInterface"])
      }
    • 直接使用this.方法名就可以访问到vuex中的actions方法;这里使用的是辅助函数,也可以使用原始方法
    • 在终端中使用node 启动脚本文件的名称 或者使用 nodemon 启动脚本文件的名称
    • 在浏览器中打开服务的地址点击我们创建的按钮查看请求接口
    • 可以看到我们的代理是请求成功的;状态之所以是304是因为第二次请求的时候如果请求没有发生改变就会使用浏览器缓存;
    • 上面遗留了一个bug就是这个方法只适用于build后的项目;在开发中每次都build无疑浪费了很多时间,下面就来在开发环境中使用服务器代理的方式完成跨域请求
    • 如果是cli创建的项目直接在config文件夹下面的index文件中的proxyTable进行添加就可以了

      

Vue使用vue-recoure + http-proxy-middleware + vuex配合promise实现基本的跨域请求封装的更多相关文章

  1. Spring Boot + Vue 跨域请求问题

    使用Spring Boot + Vue 做前后端分离项目搭建,实现登录时,出现跨域请求 Access to XMLHttpRequest at 'http://localhost/open/login ...

  2. vue实现跨域请求的设置

    vue实现跨域请求,需要在vue.config.js里添加以下设置 proxy: { '/service/rest': { target: 'http://localhost:8080/autotab ...

  3. 本地Vue项目跨域请求本地Node.js服务器的配置方法

    前言:跨域请求是在本地开发时经常遇到的需求,也很简单,只是几句代码配置一下的问题.我初次配置跨域请求时由于官方的说明太简洁,找到的教程又落伍,调试了一番并没有解决问题,到最后解决问题,已花费了很多时间 ...

  4. vue 使用axios 跨域请求数据的问题

    axios默认是没有jsonp 跨域请求的方法的.一般来说流行的做法是将跨域放在后台来解决,也就是后台开发人员添加跨域头信息. 例如java中的 header,response.setHeader(& ...

  5. $Django 前后端之 跨域问题(同源策略) vue项目(axios跨域请求数据)

    1 跨域问题(多个域之间的数据访问) #同源策略(ip port 协议全部相同) #本站的只能请求本站域名的数据 #CORS实现(跨域资源共享) #实现CORS通信的关键是服务器.只要服务器实现了CO ...

  6. VUE系列三:实现跨域请求(fetch/axios/proxytable)

    1. 在 config/index.js 配置文件中配置proxyTable 'use strict' // Template version: 1.3.1 // see http://vuejs-t ...

  7. vue.js学习之 跨域请求代理与axios传参

    vue.js学习之 跨域请求代理与axios传参 一:跨域请求代理 1:打开config/index.js module.exports{ dev: { } } 在这里面找到proxyTable{}, ...

  8. Vue ajax跨域请求

    Vue webpack-dev-server实现跨域请求 思路 配置webpack-dev-server,代理某一个路径到目标路径,同是更改源和重写 Vue里定义一个全部变量:site Vue.pro ...

  9. Vue三步完成跨域请求

    三步完成跨域请求 ①main.js中: Vue.prototype.HOME = '/api'; ② config/index.js中: module.exports = { dev: { // Pa ...

随机推荐

  1. 阿里第二轮面试:手写Java二叉树

    阿里面试 现在很多公司在招聘开发岗位的时候,都会事先在招聘信息中注明面试者应当具备的知识技能,而且在面试的过程中,有部分对于技能掌握程度有严格要求的公司还会要求面试者手写代码,这个环节很考验面试者的基 ...

  2. JavaEE就业学习路线(给初学者以及自学者一个学习方向)

    大家按这个路线学完后基本可以找工作了 第一节java入门 1-Java 背景介绍 2-Java 入门程序的编写 3-环境配置 4-基本概念介绍 5-类型转换 6-开发工具使用 第二节java基础 1- ...

  3. windows任务计划定时备份sqlserver数据库

    使用windows的任务计划新建一个sqlserver数据库的定时备份任务 一.      (我是以sqlserver2008r2数据库版本测试的)在G盘下新建文集夹Database_backup,首 ...

  4. Python实现语音识别和语音合成

    声音的本质是震动,震动的本质是位移关于时间的函数,波形文件(.wav)中记录了不同采样时刻的位移. 通过傅里叶变换,可以将时间域的声音函数分解为一系列不同频率的正弦函数的叠加,通过频率谱线的特殊分布, ...

  5. Scrapy高级用法

    日志相关 一.日志相关变量 LOG_LEVEL = '' LOG_FILE = '文件名.log' 二.日志级别 5 CRITICAL :严重错误 4 ERROR :普通错误 3 WARNING :警 ...

  6. Android服务之混合方式开启服务

    引言 前面介绍过了Android服务的两种开启方式:Start方式可以让服务在后台运行:bind方式能够调用到服务中的方法. 在实际的开发工作中,有很多需求是:既要在后台能够长期运行,又要在服务中操作 ...

  7. [LeetCode] 由 “找零钱" 所想

    Ref: [Optimization] Dynamic programming[寻找子问题] Ref: [Optimization] Advanced Dynamic programming[优于re ...

  8. (3)安装elastic6.1.3及插件kibana,x-pack,essql,head,bigdesk,cerebro,ik

    6安装nginx 6.1安装nginx 安装 pcre,zlib,openssl,nginx 6.2生成web访问用户密码 htpasswd –c –b /usr/local/nginx/conf/p ...

  9. 新手学习FFmpeg - 通过API实现可控的Filter调用链

    虽然通过声明[x][y]avfilter=a=x:b=y;avfilter=xxx的方式可以创建一个可用的Filter调用链,并且在绝大多数场合下这种方式都是靠谱和实用的. 但如果想精细化的管理AVF ...

  10. druid 连接池的配置参数

    介绍 DRUID是阿里巴巴开源平台上一个数据库连接池实现,它结合了C3P0.DBCP.PROXOOL等DB池的优点,同时加入了日志监控,可以很好的监控DB池连接和SQL的执行情况,可以说是针对监控而生 ...