记vue中封装axios

文件结构:

mocks:中是本地json数据

adapter.js: 调用本地数据方法

resources.js 统一接口管理

export default {
    fetchDict: { url: ‘/v1/system/fetchDcType‘, method: ‘post‘ }
}

重点是以下俩个文件

index.js 拦截器以及请求头设置,并添加实例属性

import Vue from ‘vue‘;
import axios from ‘axios‘;
import { Toast } from ‘vant‘;
import { TOKEN_KEY } from ‘../config‘;
import store from ‘../store/‘;
import resources from ‘./resources‘;
import generateApiMap from ‘./apiUtil‘;

axios.defaults.headers.post[‘Content-Type‘] = ‘application/x-www-form-urlencoded‘;
axios.defaults.headers.common[TOKEN_KEY] = store.state.token;
axios.defaults.xsrfHeaderName = TOKEN_KEY;

const errCheck = (code, message) => {
  if (code === 1003) {
    Toast(‘TOKEN请求失败!‘);
  } else if (code) {
    Toast(`${message}`);
  }
};
// 添加请求拦截器
axios.interceptors.request.use((config) => {
  // 在发送请求之前做些什么
  if (!config.headers[TOKEN_KEY] && store.state.token) {
    axios.defaults.headers.common[TOKEN_KEY] = store.state.token;
    config.headers[TOKEN_KEY] = store.state.token;
  }
  return config;
}, error => Promise.reject(error));

// 添加响应拦截器
axios.interceptors.response.use((response) => {
  if (response.config.showError !== false) {
    errCheck(response.data.code, response.data.msg);
  }
  if (response.data.code === 0) {
    return response;
  }
  return Promise.reject(response);
}, error => Promise.reject(error));

Vue.prototype.$http = axios;
Vue.Api = generateApiMap(resources);
Vue.prototype.$api = Vue.Api;

apiUtil.js

import axios from ‘axios‘;
import { isObject } from ‘../shared/util‘;

const replaceUrl = (url, params) => url.replace(/:[a-zA-Z0-9]*/g, (v) => {
  // url.replace(/:[a-zA-Z0-9]*/g 是匹配‘:之后的英文数字字段’
  // slice返回一个新的数组 从第一个返回 也就是去除调 :
  const key = v.slice(1);
  // 将params对象转为数组
  const newUrl = params[key];
  delete params[key];
  // 返回数组
  return newUrl;
});

// 创建axios实例
const sendApiInstance = (method, url, params, config = {}) => {
  if (!url) return null;
  const dataParams = Object.assign({}, params);
  const URI = replaceUrl(url, dataParams);
  let data = {};
  if (isObject(dataParams)) {
    data = dataParams;
  }
  // 判断请求方式返回不同方法
  return [‘post‘, ‘put‘, ‘patch‘].indexOf(method) > -1 ? axios[method](URI, data, config) : axios[method](URI, Object.assign(config, { params: data }));
};

// 遍历resources将其中每个对象转换为方法
const toMethod = (options) => {
  // 判断每一项的method 如果有就等于当前的,没有设置为get
  options.method = options.method || ‘get‘;
  return (
    params = {},
    config = {},
  ) => sendApiInstance(options.method, options.url, Object.assign(params), config);
  // return自身的arguments赋值给params

  // es5写法
  // return function () {
  //   var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  //   var config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
  //   const dataParams = Object.assign({}, params);
  //   return sendApiInstance(options.method, options.url, Object.assign(params), config);
  // };
};

// 从index.js中获取到resources.js中所有接口的信息列表对象  遍历得到每一个接口
const generateApiMap = (map) => {
  const facade = {};
  Object.keys(map).forEach((key) => {
    // key 得到每一条的key值
    facade[key] = toMethod(map[key]);
  });
  return facade;
};

// 将generateApiMap暴露出去
export default generateApiMap;

整体的思路就是首先将所有的接口放在resources.js中,在index.js中调用generateApiMap,也就是我们的apiUtil.js,在apiUtil.js中将所有的接口遍历后转换为相应的方法。

原文地址:https://www.cnblogs.com/ymdzha/p/10396699.html

时间: 2024-08-02 15:54:36

记vue中封装axios的相关文章

Vue中封装axios

参考: https://www.jianshu.com/p/7a9fbcbb1114 https://www.cnblogs.com/dreamcc/p/10752604.html 一.安装axios npm i axios -S 二.创建src/utils/axios.js.src/api/api.js axios.js用于封装axios,api.js用于管理接口 三.axios.js // axios.js import axios from "axios"; // 部分数据需要存

vue中采用axios发送post请求

这几天在使用vue中axios发送get请求的时候很顺手,但是在发送post请求的时候老是在成功的回调函数里边返回参数不存在,当时就纳闷了,经过查阅资料,终于得到了解决方案,在此做一总结: 首先我们在运用npm install axios的时候就会默认安装qs,因此我们就得将qs引入到axios中,然后需要再通过实例化一个新的axios,并且设置他的消息头为'content-type': 'application/x-www-form-urlencoded' 1 let qs = require

在vue中使用axios实现跨域请求并且设置返回的数据的格式是json格式,不是jsonp格式

在vue中使用axios实现跨域请求 需求分析:在项目中需要抓取qq音乐的歌曲列表的数据,由于要请求数据的地址url=https://c.y.qq.com/splcloud/fcgi-bin/fcg_get_diss_by_tag.fcg.从qq音乐的官网上可以看到该请求的请求头中的referer中的域名是y.qq.com(发送请求页面的域名),而host的域名是c.y.qq.com(被请求页面的域名),由于两者不一样,所以不能通过前端直接发送请求给qq服务器去拿数据.这时候需要服务器做一个代理

06 vue中使用axios跨域

本节将展示如果通过axios+proxyTable完成跨域请求并显示数据. 1.前提约束 完成nodejs,vue-cli,webpack,webpack-dev-server的安装 https://www.jianshu.com/p/eb4d9e132f62 2.操作步骤 完成vue项目中加入easytable[这时是固定数据] https://www.jianshu.com/p/bf5abb37eb3f 下载axios依赖包 cd vue-easytable cnpm install axi

vue中使用axios最详细教程

前提条件:vue-cli 项目 安装: npm npm 在main.js导入: // 引入axios,并加到原型链中 import axios from 'axios'; Vue.prototype.$axios = axios; import QS from 'qs' Vue.prototype.qs = QS; 封装好的axios,拿走不送:(最好是在main.js同级目录创建一个 https.js 文件,复制粘贴下面代码,改 接口地址 就可以用) import axios from 'ax

vue中封装svg-icon组件并使用

vue中使用svg图片有很多便捷方式,在这里记录一下模仿参考的过程,仅做一标记,方便后续回来查找 附上参考地址:https://juejin.im/post/59bb864b5188257e7a427c09 1.使用vue-cli3.0脚手架运行搭建一个项目,地址 截图如下: 2.components文件下新建SvgIcon组件 文件中的代码: 原文地址:https://www.cnblogs.com/lhjfly/p/10756650.html

vue项目封装axios并访问接口

1.在src下新建util文件夹,在util下新建request.js文件: 封装axios: import axios from 'axios' import QS from 'qs'; // import store from '@/store/index.js'; import { Message } from 'element-ui'; //element库的消息提示,可以不用 // 环境的切换 // if (process.env.NODE_ENV == 'development')

vue中的axios封装

import axios from 'axios'; import { Message } from 'element-ui'; axios.defaults.timeout = 5000;axios.defaults.headers = {'Content-Type': 'application/x-www-form-urlencoded'} axios.defaults.withCredentials = true //http request 拦截器 axios.interceptors.

vue中使用axios

1.安装axios npm: $ npm install axios -S cdn: <script src="https://unpkg.com/axios/dist/axios.min.js"></script> 2.配置axios 在项目中新建api/index.js文件,用以配置axios api/index.js import axios from 'axios'; let http = axios.create({ baseURL: 'http://