网络模块封装---axios

Vue中发送网络请求有非常多的方式那么,在开发中,如何选择呢?

选择一: 传统的Ajax是基于XMLHttpRequest(XHR)
为什么不用它呢?
非常好解释,配置和调用方式等非常混乱.·编码起来看起来就非常蛋疼.

所以真实开发中很少直接使用,而是使用jQuery-Ajax

选择二: 在前面的学习中,我们经常会使用jQuery-Ajax>相对于传统的Ajax非常好用.
为什么不选择它呢?
首先,我们先明确一点:在Vue的整个开发中都是不需要
使用jQuery了.

那么,就意味着为了方便我们进行一个网络请求,特意引用一个jQuery,你觉得合理吗?
jQuery的代码:w+行.
Vue的代码才1w+行.
完全没有必要为了用网络请求就引用这个重量级的框架.

选择三: 官方在Vue1.x的时候,推出了Vue-resource.Vue-resource的体积相对于jQuery小很多.另外Vue-resource是官方推出的.
为什么不选择它呢?

在Vue2.0退出后,Vue作者就在GitHub的Issues中说明
了去掉vue-resource并且以后也不会再更新.
那么意味着以后vue-reource不再支持新的版本时,也不会再继续更新和维护.
对以后的项目开发和维护都存在很大的隐患.

选择四: 在说明不再继续更新和维护vue-resource的同时,作者还推荐了一个框架: axios为什么不用它呢?
axios有非常多的优点并且用起来也非常方便.

稍后,我们对他详细学习.

为什么选择axios?

作者推荐和功能特点

功能特点:

  • 在浏览器中发送XMLHttpRequests请求
  • 在node.js 中发送 http请求
  • 支持 Promise API
  • 拦截请求和响应口
  • 转换请求和响应数据口
  • 等等

axiox请求方式

  • 支持多种请求方式:
    • axios(config)
    • axios.request(config)
    • axios.get(urI[L, config])
    • axios.delete(url[, config])
    • axios.head(url[, config])
    • axios.post(url[, data[, config]])
    • axios.put(url[, data[, config]I)
    • axios.patch(url[, data[, config]])
axios({
url:"https://123.2.0.0"
}).then(res =>{
	console.log(res)
})

axios 默认是 get 请求,可以传入 请求方式,如下:

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

axios({
url:"https://123.2.0.0",
method:'get',
// 专门针对 get 请求的参数拼接
params:{
type:'pop',
page:1
}
}).then(res =>{
	console.log(res)
})

有时候,我们可能需求同时发送两个请求:

  • 使用axios.all,可以放入多个请求的数组.
    axios.all()返回的结果是一个数组,
  • 使用axios.spread可将数组[res1,res2]展开为res1, res2

发送 axios 多个请求,即并发请求:

axios.all([
	axios(
		url:'https://123.2.0.0'
	),
	axios(
		url:'https://123.2.0.0')
		params:{
			type:'pop',
			page:5
		}
]).then(res =>{
		console.log(res)
	})

全局配置

在上面的示例中,我们的BaseURL是固定的事实上,

  • 在开发中可能很多参数都是固定的.
  • 这个时候我们可以进行一些抽取,也可以利用axiox的全局配置
axios.defaults.baseURL = 'http://123.27.32.32:800'
axios.defaults.headers.post['content-Type*] 
='application/x-www-form-ur1encoded';

常见的配置选项

  • 请求地址 url: "/user’,
  • 请求类型 method: ‘get’,
  • 请根路径baseURL: "http://www.mt.com/api’,
  • 请求前的数据处理t: ransformRequest:[function(data)0],
  • 请求后的数据处理t ransformResponse: [function(data)O].
  • 自定义的请求头 headersg’x-Requested-With":"XMLHttpRequest’],
  • URL查询 对象 params:{ id: 12 },
  • 查询对象序列化函数 paramsSerializer: function(params){ }
  • request body
    data: { key: 'aa},
  • 超时设置s
    timeout: 1000,跨域是否带Token
  • withCredentials: false,
  • 自定义请求处理
    adapter: function(resolve, reject, config)().
  • 身份验证信息
    auth: f uname: ", pwd: '123,
  • 响应的数据格式 json / blob /document /arraybuffer / text/ stream
    responseType: ‘json’,

当不同的页面需要请求不同的域名端口对应的接口数据时的做法:

创建对应的axios 的实例

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

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

const instance2 = axios.create({
	baseURL:'http://123.27.32.30:800',
	timeout:8000
})

instance2({
url:'/user'
}).then(res =>{
   console.log(res)
})

为什么要创建axios的实例呢?

  • 当我们从axios模块中导入对象时,使用的实例是默认的实例.
  • 当给该实例设置一些默认配置时,这些配置就被固定下来了.
  • 但是后续开发中,某些配置可能会不太一样.
  • 比如某些请求需要使用特定的baseURL或者timeout或者content-Type等.
  • 这个时候,我们就可以创建新的实例,并且传入属于该实例的配置信息.

axios 拦截器的使用

axios提供了拦截器,用于我们在发送每次请求或者得到相应后,进行对应的处理。如何使用拦截器呢?
//配置请求和响应拦截
instance.interceptors.request.use(config =>{console.log(‘来到了request拦截success中’);return config
}, err ->{
console.log('来到了request拦截failure中 ');return err
instance.interceptors.response.use(response => {console.log(‘来到了response拦截success中’);
return response.data
}, err =>{
console.log(‘来到了response拦截failure中’);return err

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值