even

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

1、axios的安装

npm安装:npm i axios --save;
使用cdn:<script src="https://unpkg.com/axios/dist/axios.min.js"></script>

2、axios的API的使用

  a、get请求

axios.get('/get.php', {
      headers: { 'Token': '46c48bec0d282018b9d167eef7711b2c' },
      baseURL: 'http://www.baidu.com',
      params: {
          name: 'abc',
          age: '20'
      }
  }).then(res => console.log(res)).catch(err => console.error(err))

   b、post请求

axios.post('/post.php', { name: 'bat', age: 33, sex: 0, phone: 15453625345 }, {
    headers: { 'Token': '46c48bec0d282018b9d167eef7711b2c' },
    baseURL: 'http://www.baidu.com',
    transformRequest: [data => {
        return qs.stringify(data);      //注意:这里需要引入qs    npm i qs --save
    }]
}).then(res => console.log(res)).catch(err => console.log(err));

 put请求与delete请求类同post请求

3、并发执行多个请求

methods: {
    ...mapActions('user', ['abc']),
    get () {
        return axios.get('/get.php', { headers: { 'Token': '46c48bec0d282018b9d167eef7711b2c' }, baseURL: 'http://www.baidu.com' });
    },
    check () {
        axios.all([this.get(), this.get(), this.get()])
          .then(axios.spread((first, second, third) => { console.log(first, second, third) }))
          .catch(err => console.log(err));
    }
}

 注意:在使用axios时,注意到配置选项中包含params和data两者,以为他们是相同的,实则不然。 

  因为params是添加到url的请求字符串中的,用于get请求。 

  而data是添加到请求体(body)中的, 用于post请求。

axios({
    method: "get",
    url: "http://www.tuling123.com/openapi/api?key=20ff1803ff65429b809a310653c9daac",
    params: {
      info: "西安天气"
    },
  })

4、axios的祥细配置

{
  // `url` 是用于请求的服务器 URL
  url: '/user',

  // `method` 是创建请求时使用的方法
  method: 'get', // 默认是 get

  // `baseURL` 将自动加在 `url` 前面,除非 `url` 是一个绝对 URL。
  // 它可以通过设置一个 `baseURL` 便于为 axios 实例的方法传递相对 URL
  baseURL: 'https://some-domain.com/api/',

  // `transformRequest` 允许在向服务器发送前,修改请求数据
  // 只能用在 'PUT', 'POST' 和 'PATCH' 这几个请求方法
  // 后面数组中的函数必须返回一个字符串,或 ArrayBuffer,或 Stream
  transformRequest: [function (data) {
    // 对 data 进行任意转换处理

    return data;
  }],

  // `transformResponse` 在传递给 then/catch 前,允许修改响应数据
  transformResponse: [function (data) {
    // 对 data 进行任意转换处理

    return data;
  }],

  // `headers` 是即将被发送的自定义请求头
  headers: {'X-Requested-With': 'XMLHttpRequest'},

  // `params` 是即将与请求一起发送的 URL 参数
  // 必须是一个无格式对象(plain object)或 URLSearchParams 对象
  params: {
    ID: 12345
  },

  // `paramsSerializer` 是一个负责 `params` 序列化的函数
  // (e.g. https://www.npmjs.com/package/qs, http://api.jquery.com/jquery.param/)
  paramsSerializer: function(params) {
    return Qs.stringify(params, {arrayFormat: 'brackets'})
  },

  // `data` 是作为请求主体被发送的数据
  // 只适用于这些请求方法 'PUT', 'POST', 和 'PATCH'
  // 在没有设置 `transformRequest` 时,必须是以下类型之一:
  // - string, plain object, ArrayBuffer, ArrayBufferView, URLSearchParams
  // - 浏览器专属:FormData, File, Blob
  // - Node 专属: Stream
  data: {
    firstName: 'Fred'
  },

  // `timeout` 指定请求超时的毫秒数(0 表示无超时时间)
  // 如果请求话费了超过 `timeout` 的时间,请求将被中断
  timeout: 1000,

  // `withCredentials` 表示跨域请求时是否需要使用凭证
  withCredentials: false, // 默认的

  // `adapter` 允许自定义处理请求,以使测试更轻松
  // 返回一个 promise 并应用一个有效的响应 (查阅 [response docs](#response-api)).
  adapter: function (config) {
    /* ... */
  },

  // `auth` 表示应该使用 HTTP 基础验证,并提供凭据
  // 这将设置一个 `Authorization` 头,覆写掉现有的任意使用 `headers` 设置的自定义 `Authorization`头
  auth: {
    username: 'janedoe',
    password: 's00pers3cret'
  },

  // `responseType` 表示服务器响应的数据类型,可以是 'arraybuffer', 'blob', 'document', 'json', 'text', 'stream'
  responseType: 'json', // 默认的

  // `xsrfCookieName` 是用作 xsrf token 的值的cookie的名称
  xsrfCookieName: 'XSRF-TOKEN', // default

  // `xsrfHeaderName` 是承载 xsrf token 的值的 HTTP 头的名称
  xsrfHeaderName: 'X-XSRF-TOKEN', // 默认的

  // `onUploadProgress` 允许为上传处理进度事件
  onUploadProgress: function (progressEvent) {
    // 对原生进度事件的处理
  },

  // `onDownloadProgress` 允许为下载处理进度事件
  onDownloadProgress: function (progressEvent) {
    // 对原生进度事件的处理
  },

  // `maxContentLength` 定义允许的响应内容的最大尺寸
  maxContentLength: 2000,

  // `validateStatus` 定义对于给定的HTTP 响应状态码是 resolve 或 reject  promise 。如果 `validateStatus` 返回 `true` (或者设置为 `null` 或 `undefined`),promise 将被 resolve; 否则,promise 将被 rejecte
  validateStatus: function (status) {
    return status >= 200 && status < 300; // 默认的
  },

  // `maxRedirects` 定义在 node.js 中 follow 的最大重定向数目
  // 如果设置为0,将不会 follow 任何重定向
  maxRedirects: 5, // 默认的

  // `httpAgent` 和 `httpsAgent` 分别在 node.js 中用于定义在执行 http 和 https 时使用的自定义代理。允许像这样配置选项:
  // `keepAlive` 默认没有启用
  httpAgent: new http.Agent({ keepAlive: true }),
  httpsAgent: new https.Agent({ keepAlive: true }),

  // 'proxy' 定义代理服务器的主机名称和端口
  // `auth` 表示 HTTP 基础验证应当用于连接代理,并提供凭据
  // 这将会设置一个 `Proxy-Authorization` 头,覆写掉已有的通过使用 `header` 设置的自定义 `Proxy-Authorization` 头。
  proxy: {
    host: '127.0.0.1',
    port: 9000,
    auth: : {
      username: 'mikeymike',
      password: 'rapunz3l'
    }
  },

  // `cancelToken` 指定用于取消请求的 cancel token
  // (查看后面的 Cancellation 这节了解更多)
  cancelToken: new CancelToken(function (cancel) {
  })
} 

在node环境中使用FormData与在浏览器模式下有所不同,需要调整adapt

// 默认配合
var defaults = {

  adapter: getDefaultAdapter()
    
  ....  
}
  
  
 // 分发函数
function getDefaultAdapter() {
  var adapter;
 
  if (typeof process !== 'undefined' && Object.prototype.toString.call(process) === '[object process]') {
    
    // node环境下使用 node.http
    adapter = require('./adapters/http');
    
  } else if (typeof XMLHttpRequest !== 'undefined') {
    
    // web 环境下使用 xhr 
    adapter = require('./adapters/xhr');
    
  }
  return adapter;
}

5、配置axios的拦截器

interceptors (instance) {      //这里的instance可以传入axios,或者是axios.create()的实例
    instance.interceptors.request.use(function (config) {
        // 在请求之前执行的动作,可以加一个菊花等待的遮罩
        return config;
    }, function (error) {
        return Promise.reject(error);
    })

    instance.interceptors.response.use(function (res) {
        // 在response后先执行的方法,可以关掉遮罩, 也可以对结果进行进一步处理返回
        return res;
    }, function (error) {
        return Promise.reject(error);
    })
}

 6、工具封装

import axios from 'axios'
import qs from 'qs'
import { Message } from 'element-ui';
import cookies from 'js-cookie'
import router from '@/router'

let server = axios.create({
    timeout: 1000,
    transformRequest: [data => {
        return qs.stringify(data);
    }],
    validateStatus: function (status) {
        return status >= 200 && status < 300; // 默认的
    }
});

server.interceptors.request.use(config => {
    return config;
}, error => {
    return Promise.reject(error);
});

server.interceptors.response.use(res => {
    return res.data;
}, error => {
    let errMsg = '';
    if (error && error.response.status) {
        switch (error.response.status) {
            case 401: errMsg = '登录状态失效,请重新登录'; cookies.remove('token'); router.push({ name: 'login' }); break;
            case 403: errMsg = '拒绝访问'; break;
            case 404: errMsg = '请求地址不存在'; break;
            case 408: errMsg = '请求超时'; break;
            case 500: errMsg = '服务器内部错误'; break;
            case 501: errMsg = '服务未实现'; break;
            case 502: errMsg = '网关错误'; break;
            case 503: errMsg = '服务不可用'; break;
            case 504: errMsg = '网关超时'; break;
            case 505: errMsg = 'HTTP版本不受支持'; break;
            default: errMsg = error.response.data.msg;
        }
    } else {
        errMsg = error;
    }
    Message.error(errMsg);
    return Promise.reject(error);
});

export default server;
posted on 2018-10-23 00:40  even_blogs  阅读(815)  评论(0编辑  收藏  举报