- axios功能特点
- 在浏览器中发送XMLHttpRequest请求
- 在node.js中发送http请求
- 支持Promise API
- 拦截请求和响应
- 转换请求和响应数据
安装 axios
npm install axios --save
axios 基本使用
| import axios from 'axios'; |
| axios({ |
| url: 'http://127.0.0.1:8080/home/multidata', |
| method: 'get' |
| }).then(res => { |
| console.log(res); |
| }) |
axios 发送并发请求
| axios.all([axios({ |
| url: 'url1', |
| params: { |
| 请求参数1: '参数1', |
| 请求参数2: '参数2' |
| } |
| }),axios({ |
| url: 'url2', |
| params: { |
| 请求参数1: '参数1' |
| } |
| })]).then(results => { |
| console.log(results); |
| }) |
| |
| |
| |
| |
| |
| |
axios.spread
| axios.all([axios({ |
| url: 'url1', |
| params: { |
| 请求参数1: '参数1', |
| 请求参数2: '参数2' |
| } |
| }),axios({ |
| url: 'url2', |
| params: { |
| 请求参数1: '参数1' |
| } |
| })]).then(axios.spread((res1,res2) =>{ |
| console.log(res1) |
| console.log(res2); |
| })) |
axios配置信息
- 全局配置
- 实际上,开发中可能很多参数都是固定的,比如 url前缀
- 这时候可以进行一些抽取,可以利用axios的全局配置
| axios.defaults.baseURL = 'http://127.0.0.0:8080' //设置公共url |
| axios.defaults.timeout = 5000 //设置请求超时时间,单位毫秒 |
- 常见配置选项
- 请求地址
- url: '/user'
- 请求类型
- method: 'get'
- 请求根路径
- baseURL: http://127.0.0.0:8080'
- 请求前数据处理
- transformRequest: [function(data){}]
- 请求后数据处理
- transfromResponse: [function(data){}]
- 自定义请求头
- headers: {'x-Requested-With':'XMLHttpRequest'}
- URL查询对象
- parms: {id: 12}
- 查询对象序列化函数
- paramsSerializer: function(params){}
- request body
- data: {key: 'value'}
- 超时设置(单位毫秒)
- timeout: 1000
- 跨域是否携带Token
- wihtCredemtials: false
- 自定义请求处理
- adapter: function(resolve, reject, config)()
- 身份验证信息
- auth: {uname: 'uname', pwd: '123'}
- 响应的数据格式 json/blob/document/arraybuffer/text/stream
- responseType: 'json'
axios 的实例
- 当从axios模块中导入对象时,使用的实例就是默认的实例
- 当给该实例设置一些默认配置时,这些配置就被固定下来了
- 但是后续开发中,某些配置可能会不太一样
- 比如某些请求需要使用特定的 baseURL或者timeout等
- 这个时候,就可以创建新的实例,并且传入属于该实例的配置信息
| |
| const instance1 = axios.create({ |
| baseURL: 'http://127.0.0.0:8080', //传入公共接口地址timeout: 5000 //设置此实例得超时时间 |
| }) |
| |
| instance1({ |
| url: '/home/multidata' |
| }).then(res =>{ |
| console.log(res); |
| }); |
| |
| instance1({ |
| url: '/home/data', |
| params: { //传入请求参数,params是针对于get请求得type: 'pop',page: 1 |
| } |
| }).then(res => { |
| console.log(res); |
| }) |
| |
封装一个网络请求模块
| |
| |
| |
| |
| |
| |
| |
| |
| import axios from 'axios'; |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| export function request(config) { |
| |
| timeout: 5000 |
| }) |
| |
| } |
| <template><div id="app"><p>{{results}}</p></div> |
| </template> |
| <script>import {request} from './network/request' |
| export default { |
| name: 'App', |
| data(){ |
| return { |
| results: '' |
| } |
| }, |
| created() { |
| |
| url: '/home/multidata' |
| }).then(res =>{ |
| this.results = res; |
| }).catch(err =>{ |
| console.log(err); |
| }) |
| } |
| } |
| </script> |
axios拦截器的使用
- 全局拦截
axios.interceptors.request.use()
- 拦截当前实例
instance.interceptors.request.use
- 拦截器的作用
- 比如config中的一些信息不符合服务器要求
- 比如每次发送网络请求,都希望在界面中显示一个请求的图标
- 某些网络请求必须携带一些特殊信息,比如登陆 token
- 请求拦截 instance.interceptors.request.use
| export function request(config) { |
| |
| timeout: 5000 |
| }) |
| |
| |
| instance.interceptors.request.use(config => { |
| |
| }, err => { |
| |
| }) |
| |
| |
| instance.interceptors.response.use(res => { |
| console.log(res); |
| return res.data; |
| }, err => { |
| console.log(err); |
| }) |
| |
| |
| } |