程序员社区

axios

目录

1.网络请求模块的选择

选择一:传统的Ajax(基于XMLHttpRequest(XML))

配置和调用混乱,所以不用

选择二:jQuery-Ajax

在Vue的整个开发中都不需要使用jQuery

jQqery的代码1w+行,没必要用这样一个重量级的框架

选择三:官方在Vue1.x的时候推出了Vue-resource

Vue-resource的体积相对于jQuery小很多

但是作者已经不维护了

选择四:axios框架

功能:

在浏览器中发送XMLHttpRequest请求

在node.js中发送http请求

支持Promise API

拦截请求和响应

转换请求和响应数据

2.axios框架的基本使用

默认是get 方法

axios({
  url: 'http://httpbin.org/get'
}).then(res => {
  console.log(res)
})
axios({
  url: 'http://httpbin.org/post',
  method: 'post'
}).then(res => {
  console.log(res)
})

axios处理并发请求

使用axios.all,可以放入多个请求的数组

axios.all([axios({
  url: 'http://httpbin.org/get'
}), axios({
  url: 'http://httpbin.org/post',
  method: 'post'
})]).then(res => {
  console.log(res)
})

也可以这样写 

axios.all([axios({
  url: 'http://httpbin.org/get'
}), axios({
  url: 'http://httpbin.org/post',
  method: 'post'
})]).then((res1, res2) => {
  console.log(res1)
  console.log(res2)
})

axios插图

3.全局配置

在开发中,可能很多参数都是固定的

我们可以做一些抽取,也可以用axios的全局配置

axios.defaults.baseURL = 'http://httpbin.org'
axios.defaults.timeout = 5000

axios.all([axios({
  url: '/get'
}), axios({
  url: '/post',
  method: 'post'
})]).then((res1, res2) => {
  console.log(res1)
  console.log(res2)
})

常见的配置选项

请求地址:url:'/user'

请求类型:method:'get'

请求根路径:baseURL:' '

URL查询对象:params:{id:12}

请求体:data: {key:'aa'}

超时设置: timeout: 1000

在使用axios时,注意配置选项中params和data的区别

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

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

4.axios的实例

为什么要创建axios实例?

我们从axios模块导入对象时,使用的实例时默认的实例

但是在后续的开发中,不同请求需要使用的配置不一样,比如baseURL

这个时候,我们需要创建新的实例,传入该请求的配置信息

const instance1 = axios.create({
  baseURL: 'http://httpbin.org',
  timeout: 5000
})

instance1({
  url: '/get'
}).then(res => {
  console.log(res)
})

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

const instance2 = axios.create({
  baseURL: 'http://123.207.32.32',
  timeout: 1000
})

instance2({
  url:''
}).then()

封装网络请求 

新建network文件夹,并建立request.js文件

export function request(config, success, failure) {
  //创建axios实例
  const instance = axios.create({
    baseURL: 'http://httpbin.org',
    timeout: 5000
  })
  //发送真正的网络请求
  instance(config)
    .then(res => {
      success(res)
    }).catch(err => {
      failure(err)
    })
}

main.js中这样写

import {request} from "../network/request";

request({
  url: '/get'
}, res => {
  console.log(res)
}, err => {
  console.log(err)
})

另一种写法

 request.js

export function request(config) {
  const instance = axios.create({
    baseURL: 'http://httpbin.org',
    timeout: 5000
  })
  instance(config.baseconfig)
    .then(res => {
      config.success(res)
    }).catch(err => {
    config.failure(err)
  })
}

 main.js

import {request} from "../network/request";

request({
  baseconfig: {
  },
  success: {
  },
  failure: {
  }
})

推荐写法

request.js

export function request(config) {
  return new Promise((resolve, reject) => {
    const instance = axios.create({
      baseURL: 'http://httpbin.org',
      timeout: 5000
    })
    instance(config)
      .then(res => {
        resolve(res)
      })
      .catch(err => {
        reject(err)
    })
  })
}

简写版 

export function request(config) {
    const instance = axios.create({
      baseURL: 'http://httpbin.org',
      timeout: 5000
    })
    return instance(config)
}

 main.js

import {request} from "../network/request";

request({
  url: '/get'
}).then(res => {
  console.log(res)
}).catch(err => {
  console.log(err)
})

5.axios的拦截器

拦截器用于我们在每次发送请求或得到响应后,进行对应的处理

request.js

export function request(config) {
    const instance = axios.create({
      baseURL: 'http://httpbin.org',
      timeout: 5000
    })
    //axios的拦截器
    //请求拦截
    instance.interceptors.request.use(config => {
      console.log(config)
      //1.config中的一些信息不符合服务器端要求,所以拦截下来处理
      //2.比如每次发送网络请求时,都希望在界面中显示一个请求的图标
      //3.某些网络请求(比如登陆(token)),必须携带一些特殊的信息
      return config
    }, err => {
      console.log(err)
    })
    //响应拦截
    instance.interceptors.response.use(res => {
      console.log(res.data)
      return res.data
    }, err => {
      console.log(err)
    })

    return instance(config)
}

赞(0) 打赏
未经允许不得转载:IDEA激活码 » axios

一个分享Java & Python知识的社区