0
点赞
收藏
分享

微信扫一扫

Vue.js_41_ 网络请求(axios)

不会弹吉他的二郎腿 2022-03-30 阅读 74


本系列博客汇总在这里:Vue.js 汇总


网络请求

  • ​​一、选择什么网络模块?​​
  • ​​1、选择一:传统的 Ajax​​
  • ​​2、选择二:jQuery-Ajax​​
  • ​​3、选择三:Vue-resource​​
  • ​​4、选择四:axios​​
  • ​​二、jsonp​​
  • ​​三、axios 框架的使用​​
  • ​​1、安装​​
  • ​​1、功能特点​​
  • ​​2、axiox 请求方式​​
  • ​​四、全局配置​​
  • ​​五、常见的配置选项​​
  • ​​六、axios 的实例​​
  • ​​七、axios 封装​​
  • ​​八、如何使用拦截器?​​


源码工程文件为:


一、选择什么网络模块?

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

1、选择一:传统的 Ajax

传统的 Ajax 是基于 XMLHttpRequest(XHR)。

为什么不用它呢?

非常好解释,配置和调用方式等非常混乱,编码起来看起来就非常头大。所以真实开发中很少直接使用,而是使用 jQuery-Ajax。

2、选择二:jQuery-Ajax

在前面的学习中,我们经常会使用 jQuery-Ajax,相对于传统的 Ajax 非常好用。

为什么不选择它呢?

首先, 我们先明确一点: 在 Vue 的整个开发中都是不需要使用 jQuery 了。那么, 就意味着为了方便我们进行一个网络请求,特意引用一个 jQuery,你觉得合理吗?jQuery 的代码 1w+ 行。Vue 的代码才 1w+ 行,完全没有必要为了用网络请求就引用这个重量级的框架。

3、选择三:Vue-resource

官方在 Vue1.x 的时候,推出了 Vue-resource,Vue-resource 的体积相对于 jQuery 小很多。另外 Vue-resource 是官方推出的。

为什么不选择它呢?

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

4、选择四:axios

在说明不再继续更新和维护 vue-resource 的同时,作者还推荐了一个框架: ​​axios​​。

为什么不用它呢?

axios 有非常多的优点,并且用起来也非常方便。

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

二、jsonp

在前端开发中,我们一种常见的网络请求方式就是 JSONP,使用 JSONP 最主要的原因往往是为了解决跨域访问的问题。

JSONP 的原理是什么呢?

JSONP 的核心在于通过 ​​<script>​​​ 标签的 src 来帮助我们请求数据,原因是我们的项目部署在​​domain1.com​​​ 服务器上时,是不能直接访问 ​​domain2.com​​​ 服务器上的资料的。这个时候,我们利用 ​​<script>​​ 标签的 src 帮助我们去服务器请求到数据,将数据当做一个 javascript 的函数来执行,并且执行的过程中传入我们需要的 json。所以,封装 jsonp 的核心就在于我们监听 window 上的 jsonp 进行回调时的名称。

JSONP 如何封装呢?

我们一起自己来封装一个处理 JSONP 的代码吧!

JSONP 封装

Vue.js_41_ 网络请求(axios)_vue

Vue.js_41_ 网络请求(axios)_vue_02

三、axios 框架的使用

1、安装


npm install axios --save


1、功能特点

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

2、axiox 请求方式

支持多种请求方式

  • axios(config)
  • axios.request(config)
  • axios.get(url[, config])
  • axios.delete(url[, config])
  • axios.head(url[, config])
  • axios.post(url[, data[, config]])
  • axios.put(url[, data[, config]])
  • axios.patch(url[, data[, config]])

如何发送请求呢?

发送 get 请求演示:

Vue.js_41_ 网络请求(axios)_jquery_03

发送并发请求:

有时候,我们可能需求同时发送两个请求,使用 axios.all,可以放入多个请求的数组,​​axios.all([])​​ 返回的结果是一个数组,使用 ​​axios.spread​​ 可将数组 ​​[res1,res2]​​ 展开为 res1, res2。

Vue.js_41_ 网络请求(axios)_json_04

四、全局配置

在上面的示例中,我们的 BaseURL 是固定的,事实上,在开发中可能很多参数都是固定的。这个时候我们可以进行一些抽取,也可以利用 axiox 的全局配置。

axios.defaults.baseURL = ‘123.207.32.32:8000’
axios.defaults.headers.post[‘Content-Type’] = ‘application/x-www-form-urlencoded’;

Vue.js_41_ 网络请求(axios)_ios_05

五、常见的配置选项

  • 请求地址:​​url: '/user'​
  • 请求类型:​​method: 'get'​
  • 请根路径:​​baseURL: 'http://www.mt.com/api'​
  • 请求前的数据处理:​​transformRequest:[function(data){}]​
  • 请求后的数据处理:​​transformResponse: [function(data){}]​
  • 自定义的请求头:​​headers:{'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: { uname: '', pwd: '12'}​
  • 响应的数据格式 json / blob /document /arraybuffer / text / stream:​​responseType: 'json'​

六、axios 的实例

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

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

Vue.js_41_ 网络请求(axios)_vue_06

Vue.js_41_ 网络请求(axios)_json_07

七、axios 封装

Vue.js_41_ 网络请求(axios)_jquery_08

八、如何使用拦截器?

axios 提供了拦截器,用于我们在发送每次请求或者得到相应后,进行对应的处理。

Vue.js_41_ 网络请求(axios)_ios_09

Vue.js_41_ 网络请求(axios)_ios_10

Vue.js_41_ 网络请求(axios)_json_11

拦截器中都做什么呢?

请求拦截可以做到的事情:

Vue.js_41_ 网络请求(axios)_json_12

请求拦截中错误拦截较少,通常都是配置相关的拦截,可能的错误比如请求超时,可以将页面跳转到一个错误页面中。

拦截器中都做什么呢?

响应拦截中完成的事情:响应的成功拦截中,主要是对数据进行过滤。

Vue.js_41_ 网络请求(axios)_vue_13

Vue.js_41_ 网络请求(axios)_vue_14

响应的失败拦截中,可以根据 status 判断报错的错误码,跳转到不同的错误提示页面。

Vue.js_41_ 网络请求(axios)_vue_15

如有错误,欢迎指正!



举报

相关推荐

0 条评论