Axios基础

232 阅读4分钟

一、Axios 简介

1.1 特性

Axios是一个基于 Promise 的 HTTP 客户端,拥有以下特性:

  • 从浏览器中创建 XMLHttpRequests
  • 从 node.js 创建 http 请求
  • 支持 Promise API
  • 拦截请求和响应
  • 转换请求数据和响应数据
  • 取消请求
  • 自动转换 JSON 数据
  • 客户端支持防御 XSRF

1.2 安装

使用 npm:

$ npm install axios

使用 yarn:

$ yarn add axios

使用 cdn:

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

1.3 axios请求方法

主要有get,post,put,patch,delete

  • get

    获取数据

  • post

    提交数据(表单提交+文件上传)

  • put

    更新数据(将所有数据均推放到服务端)

  • patch

    更新数据(只将修改的数据推送到后端)

  • delete

    删除数据

二、Axios请求

1.1 get

调用型

 axios.get(url).then((res)=>{
      console.log(res)
    })

axios()型

axios({
  method:'get',
  url:url
}).then((res)=>{
     console.log(res)
})

有参调用型

axios.get(url,{
      params:{
        id:12
      }
    }).then((res)=>{
      console.log(res)
    })

有参axios()方法型

axios({
  method:'get',
  url:url,
  params:{
    id:12
  }
}).then((res)=>{
     console.log(res)
})

1.2 post

调用型

axios.post('/post',{},config)

post方法有三个参数,分别是url、数据、config。config参数暂时不讨论。

一般上传的数据分两种

  • form-data 表单提交(图片上传、文件上传)
  • application/json
  • 以上两种数据,都可以在请求发起后,进入浏览器network查看请求头中的content-type进行查看

假设我们现在要上传一个数据:

let data = { id:12 }

那么我们可以直接将其传入:

axios.post('/post',data).then((res)=>{
  console.log(res)
})

axios()方法型

axios({
  method:'post',
  url:'/post',
  data:data
}).then(...)

1.3 put方法和patch方法

形式与post方法大体相同

1.4 delete方法

url删除法

//直接从url里面删除
axios.delete('/data.json',{
      params:{
        id:12
      }
    }).then((res)=>{
      console.log(res)
    })

请求体删除法

axios.delete('/data.json',{
      data:{
        id:12
      }
    }).then((res)=>{
      console.log(res)
    })

两种方法的删除方式是不同的,具体使用需要和后端沟通。

1.5 并发请求 axios.all

执行多个并发请求

function getUserAccount() {
  return axios.get('/user/12345');
}
​
function getUserPermissions() {
  return axios.get('/user/12345/permissions');
}
​
axios.all([getUserAccount(), getUserPermissions()])
  .then(axios.spread(function (acct, perms) {
    // 两个请求现在都执行完成
  }));

三、Axios配置

在项目上安装好axios后,需要对axios进行一些基本的配置。

3.1 基本配置

// 创建axios实例
let service =  axios.create({
  baseURL: 'https://api.example.com' // api的base_url
  timeout: 5000 // 请求超时时间
  withCredentials: true,// 允许携带cookie
})

3.2 请求拦截器配置

设置和取消请求拦截器

var myInterceptor = axios.interceptors.request.use(function () {/*...*/});
axios.interceptors.request.eject(myInterceptor);

请求拦截器我们一般和token连用,实现用户权限的认证。

利用vuex的数据仓库存储token

// request拦截器
service.interceptors.request.use(config => {
  if (store.getters.token) {
    config.headers = {
      'Authorization' : "Token " + getToken('Token'), //携带权限参数
     };
  }
  return config
}, error => {
  Promise.reject(error)
})

利用本地存储存储token

// 请求拦截
service.interceptors.request.use(config => {
  // confing.url可拿到当前页面路径,出去登陆页面,其它的页面携带token
  if (config.url !== '/login') {
    var token = localStorage.getItem('token')
    // 请求头携带token
    config.headers.Authorization = token
  }
  return config
}, error => {
  return Promise.reject('请求出错')
})

3.3 响应拦截器配置

这块需要跟服务端约定接口响应全局码,从而统一处理登录校验失败无权限成功等结果。

// respone拦截器
service.interceptors.response.use(
  response => {
   /**
    * status:200,接口正常返回;
    */
    const res = response.data
    if (res.status !== 200) {
      Message({
        message: res.message,
        type: 'error',
        duration: 5 * 1000
      })
      // 根据服务端约定的状态码:5001:非法的token; 5002:其他客户端登录了; 5004:Token 过期了;
      if (res.code === 5001 || res.code === 5002 || res.code === 5004) {
          MessageBox.confirm('你已被登出,可以取消继续留在该页面,或者重新登录', '确定登出', {
            confirmButtonText: '重新登录',
            cancelButtonText: '取消',
            type: 'warning'
          }).then(() => {
            store.dispatch('LogOut').then(() => {
              location.reload()// 为了重新实例化vue-router对象 避免bug
            })
          })
      }
      return Promise.reject('error')
    } else { // res.code === 200,正常返回数据
        return response.data
    }
  },
  error => {
    Message({
      message: error.message,
      type: 'error',
      duration: 5 * 1000
    })
    return Promise.reject(error)
  }
)

这方面的内容就比较多了,不同的项目有不同的需求,在这里就不做赘述了。

这个实例代码用了vuex的数据仓库和Element UI组件的弹框组件。

四、优缺点总结

axios的优缺点:

  • 在浏览器中创建XMLHttpRequest请求,在node.js中创建http请求。
  • 解决回调地狱问题。
  • 自动转化为json数据类型。
  • 支持Promise技术,提供并发请求接口。
  • 可以通过网络请求检测进度。
  • 提供超时处理。
  • 浏览器兼容性良好。
  • 有拦截器,可以对请求和响应统一处理。

引用

Axios中文说明

完整过一遍axios,再也不怕写请求

axios封装,处理请求拦截、响应拦截,请求头携带token设置

前后端数据交互(六)——ajax 、fetch 和 axios 优缺点及比较