参考 https://www.jianshu.com/p/f959366fadb8

一、安装

1、直接引用

<script src="https://unpkg.com/axios/dist/axios.min.js"></script>

2、在VUE CLI中使用

进入项目然后安装axios

npm install axios --save

因为axios不是vue的插件,所以不能直接用use方法,需要将其加载到原型上。

import axios from 'axios'

如果要全局使用axios就需要在main.js中设置成全局的,然后再组件中通过this调用

Vue.prototype.$axios = axios;

this.$axios.get();

二、简单使用

发送一个最简单的请求

1、get请求

这里我们发送一个带参数的get请求,params参数放在get方法的第二个参数中,如果没有参数get方法里可以只写路径。如果请求失败捕获一下异常。

axios
  .get('http://www.httpbin.org/get',{
      params: {
         id: 5
      }
   })
  .then(res => {
    console.log('数据是:', res);
  })
  .catch((e) => {
    console.log('获取数据失败');
  });

查看输出

axios 修改数据 axios调用_拦截器

2、post请求

当然,我们也可以发送一个POST请求,post方法的第二个参数为请求参数对象。

import axios from 'axios'

axios.post('http://www.httpbin.org/post',{
  name: 'wangxiaoyu'
})
.then(function(res){
  console.log('数据是:',res);
})
.catch(function(err){
  console.log(err);
});

查看输出

axios 修改数据 axios调用_ios_02

3、一次合并发送多个请求

分别写两个请求函数,利用axios的all方法接收一个由每个请求函数组成的数组,可以一次性发送多个请求,如果全部请求成功,在axios.spread方法接收一个回调函数,该函数的参数就是每个请求返回的结果。

function getUserAccount(){
  return axios.get('/user/12345');
}
function getUserPermissions(){
  return axios.get('/user/12345/permissions');
}
this.$axios.all([getUserAccount(),getUserPermissions()])
  .then(axios.spread(function(res1,res2){
    //当这两个请求都完成的时候会触发这个函数,两个参数分别代表返回的结果
}))

三、axios API

以上通过axios直接调用方法来发起对应的请求其实是axios为了方便起见给不同的请求提供的别名方法。我们完全可以通过调用axios的API,传递一个配置对象来发起请求。

发送post请求,参数写在data属性中

import axios from 'axios'
axios({
  url: 'http://www.httpbin.org/post',
  method: 'post',
  data: {
    name: 'wangxiaoyu'
  }
}).then(res => {
  console.log('请求结果:', res);
})

发送get请求,默认就是get请求,直接第一个参数写路径,第二个参数写配置对象,参数通过params属性设置。

import axios from 'axios'
axios({
  url: 'http://www.httpbin.org/get',
  params: {
    'name': 'wangxiaoyu'
  }
}).then(res => {
  console.log('请求结果:', res);
})

axios为所有请求方式都提供了别名:

axios.request(config)

axios.get(url, [config])

axios.delete(url, [config])

axios.head(url, [config])

axios.options(url, [config])

axios.post(url, [data], [config])

axios.put(url, [data], [config])

axios.patch(url, [data], [config])

四、axios配置默认值

1、可以通过axios.defaults设置全局默认值,在所有请求中都生效。

axios.defaults.headers.common["token"] = ""
axios.defaults.headers.post["Content-type"] = "application/json"
axios.defaults.baseURL = 'https://service.xxx.com; //设置统一路径前缀

2、也可以自定义实例的默认值,以及修改实例的配置

// 创建时自定义默认配置,超时设置为全局默认值0秒
let ax = axios.create({
  baseURL: 'http://rap2api.taobao.org',
  params: { name: '小月' }
});
// 修改配置后,超时设置为4秒
ax.defaults.timeout = 4000;

3、也可以像前面那样,在每个请求中设置相关的配置。

axios('/app/mock/121145/get', {
  params: {
    name: 'xiaoxiao'
  },
  baseURL: 'http://rap2api.taobao.org'
})

4、以上配置方法优先级从1-3依次增高,更多配置选项查看文档。

{
    method:'请求方法',
    baseURL:'如果路径不是绝对路径,就会在路径前自动添加此路径',
    transformRequest: [(data, header)=>{}], //在发送请求之前修改数据,适用于post、put、patch
    transformResponse:  [(data)=>{
        return JSON.parse(data).data;
    }], //在收到的数据传到then之前修改数据,注意这里data是个字符串类型。
    header: {'X-Requested-With': 'XMLHttpRequest'}, //请求头
    params: {}, //请求参数
    paramsSerializer: (params)=>{
        return qs.stringify(params); //name=xiaohong&id=1
    } //可选函数,可以把参数拼接成字符串
    data: {}, // post类方法的请求体参数
    timeout: 0, //请求延时事件,如果超时请求终止
    withCredentials: false, //是否时跨站点请求
    onUploadProgress: (progressEvent)=>{
        //可以通过progressEvent拿到上传的进度
    },
    onDownloadProgress: ()=>{},//和onUploadProgress一样,获取下载的进度
    responseType: json,  // 返回的数据格式
    maxContentLength: 2000, //相应内容的最大尺寸
    validateStatus: (validateStatus)=>{
        return validateStatus >= 200; //限制相应状态码,如果不满足就拒绝
    },
    cancelToken: new cancelToken(function(cancel){}) // 指定一个取消请求标识,下面会用到
}

五、axios实例

参考 axios实例

1、为什么要创建axios实例,它与我们直接使用的axios.get这样的写法有什么区别?

  • 引入axios,然后在页面中进行请求axios.get(‘url’).then(res=>{}),这里默认会导出实例,通常使用这个axios就可以了
  • 而之所以要创建axios实例,是因为我们实际工作项目中,可能需要访问多个服务地址,而这些服务请求和响应的结构也可能都完全不同,那么你可以通过axios.create创建不同的实例来处理。
  • 比如axios1是用http状态码确定响应是否正常,而axios2是服务器自己定义的状态码,又或者他们请求头不同,支持的content-type不同,那么我可以单独为axios1和axios2写拦截器。

2、axios实例的配置

//常用的基本配置
    axios.create({
        baseURL:'http://localhost:8080', //请求的域名,基本地址
        timeout:5000,  //请求的超时时长,单位毫秒
        url:'/data.json',  //请求的路径
        method:'get,post,put,patch,delete' , //请求方法
        headers:{
            token:''  //比如token登录鉴权,请求的时候携带token,让后端识别登录人的信息
        },   //请求头
        params:{},  //请求参数拼接在URL上
        data:{},    //请求参数放在请求体里

    })

3、都哪里可以配置axios呢

(1)axios全局配置

//axios.defaults.后边跟的就是axios的那些配置
//一般修改的全局配置,也就下边这两个
axios.defaults.timeout = 1000 
axios.defaults.baseURL = 'http://localhost:8080'

(2)axios实例配置

//如果create()里不添加参数的话,在创建这个axios实例的时候,使用的就是全局的配置
// 这个时候instance的timeout是1000
const instance = axios.create(); 

//如果设置了全局的配置,但是又想在创建的实例里修改配置怎么办
instance.default.timeout = 3000

(3)axios请求配置

let instance = axios.create();
 instance.get(’/data.json’,{
 timeout:5000
 })

这3种配置方法的优先级是 axios请求配置 > axios实例配置 > axios全局配置

4、具体的使用

在实际开发项目中,全局配置的局限性比较大,一般我们会全局配置两个参数,axios.defaults.timeout和axios.defaults.baseURL

假如我们有两个请求接口,那么我们一般的做法是创建两个axios实例

axios.defaults.timeout = 1000 
axios.defaults.baseURL = 'http://localhost:8080'

const instance1 = axios.create({
      baseurl:'http://localhost:8080',
      timeout:'1000'
})

const instance2 = axios.create({
      baseurl:'http://localhost:9090',
      timeout:'3000'
})

//instance1这里用到的参数有 baseurl,timeout,method,url
instance1.get('/userinfo').then(res=>{
  console.log(res)
})

//instance2这里用到的参数有 baseurl,timeout,method,url,params,并且对timeout进行了修改
instance1.get('/orderlist',{
    timeout:'5000'
    params:{}
}).then(res=>{
  console.log(res)
})

六、axios拦截器

应用场景:
1:每个请求都带上的参数,比如token,时间戳等。
2:对返回的状态进行判断,比如token是否过期

1、创建一个axios实例

let instance = axios.create({
  headers: {
    'content-type': 'application/x-www-form-urlencoded'
  }
})

2、编写请求拦截器

这个拦截器会在你发送请求之前运行

这个请求拦截器的功能是为我每一次请求去判断是否有token,如果token存在则在请求头加上这个token。后台会判断我这个token是否过期。

// http request 拦截器
instance.interceptors.request.use(
  config => {
    // 每次发送请求之前判断session中是否存在token
    // 如果存在,则统一在http请求的header都加上token,这样后台根据token判断你的登录情况
    // 即使本地存在token,也有可能token是过期的,所以在响应拦截器中要对返回状态进行判断
    const token = sessionStorage.getItem('token')
    if (token ) {
      config.headers.authorization = token  //请求头加上token
    }
    //一定要return config
    return config
  },
  err => {
    return Promise.reject(err)
  })

3、响应拦截器

instance.interceptors.response.use(
  response => {
    // 如果返回的状态码为200,说明接口请求成功,可以正常拿到数据
    // 否则的话抛出错误
    if (response.status === 200) {
      return Promise.resolve(response);
    } else {
      return Promise.reject(response);
    }
  },
  // 服务器状态码不是2开头的的情况
  // 这里可以跟你们的后台开发人员协商好统一的错误状态码
  // 然后根据返回的状态码进行一些操作,例如登录过期提示,错误提示等等
  // 下面列举几个常见的操作,其他需求可自行扩展
  error => {
    if (error.response.status) {
      switch (error.response.status) {
        // 401: 未登录
        // 未登录则跳转登录页面,并携带当前页面的路径
        // 在登录成功后返回当前页面,这一步需要在登录页操作。
        case 401:
          vant.Toast.fail("身份验证失败,请关闭重新进入。");
          break;

        // 403 token过期
        // 登录过期对用户进行提示
        // 清除本地token和清空vuex中token对象
        // 跳转登录页面
        case 403:
          vant.Toast.fail("登录过期,请关闭重新进入。");
          // 清除token
          break;

        // 404请求不存在
        case 404:
          vant.Toast.fail("您访问的网页不存在。");
          break;
        // 其他错误,直接抛出错误提示
        default:
          vant.Toast.fail(error.response.data.message);
      }
      return Promise.reject(error.response);
    }
  }
);

最后把实例导出

export default instance

在需要的页面导入就可以使用了

import instance from './axios'

/* 验证登陆 */
export function handleLogin (data) {
  return instance.post('/ds/user/login', data)
}