axios常规使用

88 阅读4分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

axios

安装

npm install --save axios

axios请求方法:get/post/put/patch/delete

get:获取数据

post:提交数据(表单提交/文件上传)

put/patch:更新数据,put是将所有的数据提交到后端;patch是只将修改的数据推送到后端

delete:删除数据

axios请求方法和别名

get

import axios from 'axios'

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

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

post/put/patch

let data = {id:12}

// Content-Type:application/json

axios.post(url,data).then(res => console.log(res))

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



// Content-Type:mutipart/form-data 

let formData = new FormData()

for(let key in data){

  formData.append(key,data[key])

}

axios.post(url,formData).then(res => console.log(res))

delete

// 把参数拼在url

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

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

// 把参数放在请求体

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

并发请求

同时进行多个请求,并统一处理返回值

axios.all[axios,axios,...] 

axios.spread是在axios.all多个请求完成的时候,把返回数据进行分割处理


axios.all([

  axios.get('/data1')

  axios.get('/data2')

]).then(

axios.spread((data1,data2) => { 

    console.log(data1,data2)

  })

)

创建axios实例

后端接口地址有多个,并且超时时长不一样,可以在实例中配置两种参数,然后用实例去请求。


let instance = axios.create({

  baseUrl:'http://localhost:8080',

  timeout:1000

})

let instance2 = axios.create({

  baseUrl:'http://localhost:3000',

  timeout:5000

})

instance.get(url).then(() => {})

axios实例的常用相关配置

以下配置优先级从低到高

axios全局配置

axios.defaults.timeout = 1000

axios实例配置

let instance = axios.create({

  baseUrl:'http://localhost:8080', // 请求的域名,基本地址

  timeout:1000, // 请求超时时长

  url:'/data',// 请求的路径

  method:'get', //请求方法get/post/put/patch/delete

  headers:{// 设置请求头

    token:'', //登陆鉴权token识别当前登陆人的信息

  }, 

  params:{}, // 请求参数拼接在url

  data:{}, // 请求参数放在请求体

})

axios请求配置

axios.get(url,{timeout:5000}})

拦截器

在请求或响应被处理之前拦截它们


// 请求拦截器

axios.interceptors.request.use(config => {

  // 在发送请求前做些什么

  return config

},err => {

  // 在请求错误的时候做些什么

  return Promise.reject(err) // 请求没有到达后端

})


// 响应拦截器

axios.interceptors.request.use(res => {

  // 请求成功对响应数据做处理

  return res // 到达get方法的then回调里 

},err => {

  // 在响应错误的时候做些什么

  return Promise.reject(err) // 到达get方法里的catch回调里

})


// 取消拦截器

let interceptors = axios.interceptors.request.use(config => {

  config.header = {auth:true}

  return config

})

axios.interceptors.request.eject(interceptors)

登陆

配置最好写在实例里,避免全局axios被污染


// 访问需要登陆的接口的axios实例

let instance = axios.create({})

instance.interceptors.request.use = config => {

  config.headers.token = ''

  return config

}

// 访问不需要登陆的接口的axios实例

let instance2 = axios.create({})

instance.interceptors.request.use = config => {

  return config

}

// 移动端开发,提升用户体验度

let instance_phone = axios.create({})

instance_phone.interceptors.request.use = config => {

  $('#loading').show()

  return config

}

instance_phone.interceptors.response.use = res => {

  $('#loading').hide()

  return res

}

错误处理

请求错误时,进行的处理。catch。实际开发中,一般统一添加错误处理,统一处理在实例上添加catch方法;某个接口的特殊处理,在方法上添加对应的catch方法

404 请求未找到

401 请求超时

400 参数错误

500 系统错误

502 系统重启

取消请求

用于取消正在进行的http请求,axios.CancelToken

CRM后台管理系统增删改查操作,涉及到大批量数据的处理,可能请求时间会比较长。若是用户等待时间比较长,改变查询意向的情况下,就可以用到这个取消请求


let source = axios.axios.CancelToken.source()

axios.get('/data.json',{

  cancelToken:source.token // 添加取消请求token

})

  .then(res => console.log(res))

  .catch(err => console.log(res))

source.cancel('cancel http')

封装axios


// /service/contactApi.js

const CONTACT_API = {

  getContactList:{

    method:'get',

    url:'/contactList'

  },

  newContactForm:{ // 新建联系人 form-data

    method:'post',

    url:'/contact/new/form'

  },

  newContactJSON:{ // 新建联系人 application/json

    method:'post',

    url:'/contact/new/json'

  },

  editContact:{// 编辑联系人

    method:'put', 

    url:'/contact/edit'

  },

  delContact:{ // 删除联系人

    method:'delete', 

    url:'/contact/delete'

  }

}

export default CONTACT_API


// /service/http.js

import axios from 'axios'

import contactApi from './contactApi'

// contactApi循环遍历输出不同的请求方法

let instance = axios.create({

  baseUrl:'http://localhost:9000/api',

  timeout:1000

})

const Http = {} // 包裹请求方法的容器

// 请求格式/参数的统一

for(let key in contactApi){

  let api = contactApi[key]

  //params 请求参数,get/delete (url),put/patch/post (data)

// isFormData 标识是否form-data请求

  // config 请求配置参数

  Http[key] = async function(

    params,

      isFormData = false,

      config = {}

  ){

    let url = api.url

    let method = api.method

    let newParams;

    // 判断content-type是否是form-data

    if(params && isFormData){

      newParams = new FormData()

      for(let key in params){

        newParams.append(key,params[key])

      }

    }else{

      newParams = params

    }

    let res = {}; 

    if(method === 'put' || method === 'patch' || method === 'post'){

      try{

      res = await instance[method](url,newParams,config)

      }catch(err){res = err}

    }else if(method === 'get' || method === 'delete'){

      try{

        config.params = newParams

        res = await instance[method](url,config)

      }catch(err){res = err}

    }

  }

  return res

}

// 拦截器的添加

instance.interceptors.request.use(config => {

  // 发起请求前做些什么

  Toast.loading({

    mask:true,

    duration:0, // 一直存在

    forbidClick:true, // 禁止点击

    message:'加载中...'

  })

  return config

},err => {

  // 请求失败

  Toast.clear()

  Toast('请求错误,请稍后重试')

})

instance.interceptors.response.use(res => {

  // 响应成功后做什么

  Toast.clear()

  return res.data

},err => {

  // 响应失败

  Toast.clear()

  Toast('响应错误,请稍后重试')

})

export default Http;


// main.js

import Http from './service/http'

Vue.prototype.$Http = Http // 挂载Http到Vue实例上,这样不需要在每个文件里,都import了,全局可用$Http


<script>

  methods:{

    // 获取联系人列表

    async getList(){

      let res = await this.$Http.getContactList()

      this.list = res.data

    },

    asynct save(){

      let res = await this.$Http.newContactJSON(contactObj)

      // let res = await this.$Http.newContactForm(contactObj,true)

      if(res.code === 200){

        Toast('新建成功')

        this.showEdit = false

        this.getList

      }

    }

  }

</script>