Axios是什么?

Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中。我们知道 Promise 是 js 异步的一种解决方案,它最大的特性就是可以通过 .then 的方式来进行链式调用。

其实说白了axios是对ajax的封装,axios有的ajax都有,ajax有的axios不一定有,总结一句话就是axios是ajax,ajax不止axios。

为什么选择axios?

  1. vue的作者尤雨溪推荐使用axios.
  2. 符合前后端分离的趋势,及前端的MVVM的浪潮

功能特点:

  • 在浏览器中发送XMLHttpRequests请求
  • 在node.js中发送http请求
  • 支持Promise API
  • 拦截请求和响应
  • 转换请求和响应数据
  • 取消请求
  • 自动转换 JSON 数据
  • 客户端支持防御 XSRF

支持多种请求方式:

  • 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] ])

Axios的基本使用

axios的使用比较简单,文档讲的也非常清晰,你应该先阅读axios的官方文档:axios文档。

在html页面中直接引入使用:

<script src="https://unpkg.com/axios/dist/axios.min.js"></script>

Html页面基本使用

以下案例中的get请求地址为crmeb相关演示站地址,可用于测试获取!

  1. 获取一个get请求
<script>const url = 'https://store.crmeb.net/api/pc/get_category_product'axios({url: url,method: 'get',  // 这里可以省略,默认为get}).then(res => {// 返回请求到的数据console.log(res)}).catch(err => {// 返回错误信息console.log(err)})
</script>
  1. 在get请求的url中传参,只需要定义一个params:{}即可!
<script>const url = 'https://store.crmeb.net/api/pc/get_category_product'axios({url: url,method: 'get',  // 这里可以省略,默认为get// 这里的键值对会拼接成这样url?page=1&limit=3params: {page: 1,limit: 3}}).then(res => {// 返回请求到的数据console.log(res)}).catch(err => {// 返回错误信息console.log(err)})
</script>
  1. 发送一个post请求,与get请求类似,只需要将method改为post,定义一个data:{}即可,data中的数据则是服务器需要接收的字段数据!
<script>
axios({method: 'post',url: '/user/12345',data: {firstName: 'Fred',lastName: 'Flintstone'}
}).then(res => {// 返回请求到的数据console.log(res)}).catch(err => {// 返回错误信息console.log(err)});
</script>
  1. 发送一个并发请求
    如果在开发中需要等到多个接口的数据同时请求到后才能继续后边的逻辑,那么即可使用并发请求,axios并发请求,使用all方法,all方法的参数为一个数组,数组的每个值可以为一次请求,请求完成后直接.then即可合并两次请求的数据,返回结果为一个数组!
<script>
axios.all([axios({url: 'https://store.crmeb.net/api/pc/get_products',params: {page: 1,limit: 20,cid: 57,sid: 0,priceOrder: '', news: 0,}}),axios({url: 'https://store.crmeb.net/api/pc/get_company_info',})
]).then(results => {console.log(results)
})
</script>

如果你想自动把这个数组展开的话在then()方法中传入axios.spread()方法即可,如下所示:

<script>
axios.all([axios({url: 'https://store.crmeb.net/api/pc/get_products',params: {page: 1,limit: 20,cid: 57,sid: 0,priceOrder: '', news: 0,}}),axios({url: 'https://store.crmeb.net/api/pc/get_company_info',})
]).then(axios.spread((res1, res2) => {console.log(res1);console.log(res2);
}))
</script>

但在使用vue组件化开发的时候一般我们会通过npm安装,引入项目!

组件化开发中使用

  1. 使用npm进行安装
npm install axios --save

一般在实际项目中我们并不会像上边这样直接去使用axios请求数据,而是将axios封装在一个单独的文件,这样做的目的主要是用来抽取公共逻辑到一个配置文件里,对这些公共逻辑做一个封装,即使某一天这个axios框架不维护了,或者出现了重大bug也不再修复的时候,我们可以只修改配置文件即可达到全局修改的目的,如果把每次请求逻辑都写到对应的组件中,那修改起来简直就是一个噩梦!

  1. 封装一个axios的请求文件request.js
    在项目的src目录下创建一个network文件夹,在再其中创建一个request.js文件,路径为:src/network/request.js
// src/network/request.js// 引入axios
import axios from 'axios'// 这里未使用default导出,是为了以后的扩展,便于导出多个方法
export function request(config){// 创建axios实例const instance = axios.create({// 这里定义每次请求的公共数据,例如全局请求头,api根地址,过期时间等// 具体参数可参考axios的官方文档baseURL: 'http://demo26.crmeb.net/api',timeout: 5000})// 拦截请求,如果获取某个请求需要携带一些额外数据instance.interceptors.request.use(config => {console.log(config);return config;}, err => {console.log(err);})// 拦截响应instance.interceptors.response.use(res => {console.log(res)return res.data}, err => {console.log(err)})// 发送请求return instance(config)
  1. 使用我们封装的request请求
    一般我们会将所有的请求放在一个api.js文件中,将每次请求封装为一个方法,比如我这里会在request.js的同目录创建一个api.js文件封装我们所有的请求。
import { request } from '../api/request'// 获取分类
export const getHomeCategory = () => {return request({url: '/category'})
}// 获取banner图
export const getHomeBanner = () => {return request({url: '/pc/get_banner'})
}

之后再在组件中引入调用导出的相关接口方法即可,如:

import { getHomeBanner } from "../network/api"getHomeBanner().then(res => {console.log(res)
})

以上就是一个简单的封装,其中有个拦截请求和拦截响应,可能很多初学的人理解起来有点吃力,我在这里以个人浅见阐述,希望能带给你些许启发!

何为拦截器?

还是发挥阅读理解能力,拦截拦截其实就是此路是我开,此树是我栽,要想过此路,留下买路钱,拦截请求就是比如某些请求需要携带一些额外的信息才能访问,实际项目中最常见的就是需要登录后才能查看的信息,请求中就必须携带token才能访问,就可以在这里处理,还有拦截响应,比如请求到数据之后,发现不符合要求,先拦下来处理一下,再返回给前端,这就是一个拦截器的基本工作流程!

  • axios有一个全局拦截的方式:axios.interceptors()
  • 拦截成功后必须return返回,否则数据无法请求到
    如下所示:
  // 拦截请求,如果获取某个请求需要携带一些额外数据instance.interceptors.request.use(config => {console.log(config);return config;}, err => {console.log(err);})// 拦截响应instance.interceptors.response.use(res => {console.log(res)return res.data}, err => {console.log(err)})

axios还为我们提供了一些全局配置,如下:

axios.defaults.baseURL = 'https://api.example.com';
axios.defaults.headers.common['Authorization'] = AUTH_TOKEN;
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';

当然也可以将其配置在我们之前创建的axios实例中,使其只作用于某个实例!

然后来看一下 axios 的所有配置信息:

数据来自axios中文文档

{// `url` 是用于请求的服务器 URLurl: '/user',// `method` 是创建请求时使用的方法method: 'get', // default// `baseURL` 将自动加在 `url` 前面,除非 `url` 是一个绝对 URL。// 它可以通过设置一个 `baseURL` 便于为 axios 实例的方法传递相对 URLbaseURL: 'https://some-domain.com/api/',// `transformRequest` 允许在向服务器发送前,修改请求数据// 只能用在 'PUT', 'POST' 和 'PATCH' 这几个请求方法// 后面数组中的函数必须返回一个字符串,或 ArrayBuffer,或 StreamtransformRequest: [function (data, headers) {// 对 data 进行任意转换处理return data;}],// `transformResponse` 在传递给 then/catch 前,允许修改响应数据transformResponse: [function (data) {// 对 data 进行任意转换处理return data;}],// `headers` 是即将被发送的自定义请求头headers: {'X-Requested-With': 'XMLHttpRequest'},// `params` 是即将与请求一起发送的 URL 参数// 必须是一个无格式对象(plain object)或 URLSearchParams 对象params: {ID: 12345},// `paramsSerializer` 是一个负责 `params` 序列化的函数// (e.g. https://www.npmjs.com/package/qs, http://api.jquery.com/jquery.param/)paramsSerializer: function(params) {return Qs.stringify(params, {arrayFormat: 'brackets'})},// `data` 是作为请求主体被发送的数据// 只适用于这些请求方法 'PUT', 'POST', 和 'PATCH'// 在没有设置 `transformRequest` 时,必须是以下类型之一:// - string, plain object, ArrayBuffer, ArrayBufferView, URLSearchParams// - 浏览器专属:FormData, File, Blob// - Node 专属: Streamdata: {firstName: 'Fred'},// `timeout` 指定请求超时的毫秒数(0 表示无超时时间)// 如果请求话费了超过 `timeout` 的时间,请求将被中断timeout: 1000,// `withCredentials` 表示跨域请求时是否需要使用凭证withCredentials: false, // default// `adapter` 允许自定义处理请求,以使测试更轻松// 返回一个 promise 并应用一个有效的响应 (查阅 [response docs](#response-api)).adapter: function (config) {/* ... */},// `auth` 表示应该使用 HTTP 基础验证,并提供凭据// 这将设置一个 `Authorization` 头,覆写掉现有的任意使用 `headers` 设置的自定义 `Authorization`头auth: {username: 'janedoe',password: 's00pers3cret'},// `responseType` 表示服务器响应的数据类型,可以是 'arraybuffer', 'blob', 'document', 'json', 'text', 'stream'responseType: 'json', // default// `responseEncoding` indicates encoding to use for decoding responses// Note: Ignored for `responseType` of 'stream' or client-side requestsresponseEncoding: 'utf8', // default// `xsrfCookieName` 是用作 xsrf token 的值的cookie的名称xsrfCookieName: 'XSRF-TOKEN', // default// `xsrfHeaderName` is the name of the http header that carries the xsrf token valuexsrfHeaderName: 'X-XSRF-TOKEN', // default// `onUploadProgress` 允许为上传处理进度事件onUploadProgress: function (progressEvent) {// Do whatever you want with the native progress event},// `onDownloadProgress` 允许为下载处理进度事件onDownloadProgress: function (progressEvent) {// 对原生进度事件的处理},// `maxContentLength` 定义允许的响应内容的最大尺寸maxContentLength: 2000,// `validateStatus` 定义对于给定的HTTP 响应状态码是 resolve 或 reject  promise 。如果 `validateStatus` 返回 `true` (或者设置为 `null` 或 `undefined`),promise 将被 resolve; 否则,promise 将被 rejectevalidateStatus: function (status) {return status >= 200 && status < 300; // default},// `maxRedirects` 定义在 node.js 中 follow 的最大重定向数目// 如果设置为0,将不会 follow 任何重定向maxRedirects: 5, // default// `socketPath` defines a UNIX Socket to be used in node.js.// e.g. '/var/run/docker.sock' to send requests to the docker daemon.// Only either `socketPath` or `proxy` can be specified.// If both are specified, `socketPath` is used.socketPath: null, // default// `httpAgent` 和 `httpsAgent` 分别在 node.js 中用于定义在执行 http 和 https 时使用的自定义代理。允许像这样配置选项:// `keepAlive` 默认没有启用httpAgent: new http.Agent({ keepAlive: true }),httpsAgent: new https.Agent({ keepAlive: true }),// 'proxy' 定义代理服务器的主机名称和端口// `auth` 表示 HTTP 基础验证应当用于连接代理,并提供凭据// 这将会设置一个 `Proxy-Authorization` 头,覆写掉已有的通过使用 `header` 设置的自定义 `Proxy-Authorization` 头。proxy: {host: '127.0.0.1',port: 9000,auth: {username: 'mikeymike',password: 'rapunz3l'}},// `cancelToken` 指定用于取消请求的 cancel token// (查看后面的 Cancellation 这节了解更多)cancelToken: new CancelToken(function (cancel) {})
}

感谢您的阅读,如果对您有帮助,欢迎关注"CRMEB"。码云上有我们开源的商城项目,知识付费项目,JAVA版全开源商城系统,学习研究欢迎使用,老铁顺手点个star呗,老板奖励五毛,分你两毛五,

19. 详解网络请求Axios相关推荐

  1. HTTP详解(请求方式)

    原文地址:HTTP协议详解(真的很经典) 作者:308938969 HTTP是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于分布式超媒体信息系统.它于1990年提出,经过几年的使用与发 ...

  2. ARP命令详解--网络命令详解二

    显示和修改"地址解析协议 (ARP)"缓存中的项目.ARP 缓存中包含一个或多个表,它们用于存储 IP 地址及其经过解析的以太网或令牌环物理地址.计算机上安装的每一个以太网或令牌环 ...

  3. 90分钟详解网络编程相关的细节处理丨 reactor丨网络io丨epoll丨C/C++丨Linux服务器开发丨后端开发丨Linux后台开发

    90分钟搞懂网络编程相关细节处理 1. 网络编程四要素 2. io多路复用 3. reactor三种基础封装方式 视频讲解如下,点击观看: 90分钟详解网络编程相关的细节处理丨 reactor丨网络i ...

  4. dsniff 和 Ettercap 和 bettercap 详解 - 网络嗅探工具包

    官网:https://www.monkey.org/~dugsong/dsniff/ linux 嗅探工具 Dsniff 详解:https://wenku.baidu.com/view/61a1788 ...

  5. vue 网络请求 axios vue POST请求 vue GET请求 代码示例

    QQ技术交流群 173683866 526474645 欢迎加入交流讨论,打广告的一律飞机票 1.安装 axios 和 vue-axios 和 qs (qs是为了解决post默认使用的是x-www-f ...

  6. react native 网络请求 axios

    react native的网络请求推荐使用axios和fetch 两种方式,当前阐述的是axios 1.安装axios yarn add react-native-axios 2.创建一个js,进行基 ...

  7. ASP.NET 运行时详解 揭开请求过程神秘面纱

    对于ASP.NET开发,排在前五的话题离不开请求生命周期.像什么Cache.身份认证.Role管理.Routing映射,微软到底在请求过程中干了哪些隐秘的事,现在是时候揭晓了.抛开乌云见晴天,接下来就 ...

  8. javaweb_笔记2(Servlet源码分析;request详解;请求域;转发和重定向;WebServlet注解;jsp基础语法,JavaBean。)

    1.HttpServlet源码分析 HttpServlet类是专门为HTTP协议准备的.比GenericServlet更加适合HTTP协议下的开发. HttpServlet在哪个包下? jakarta ...

  9. (转)ASIHTTPRequest 详解, http 请求终结者

    2019独角兽企业重金招聘Python工程师标准>>> 一月 8, 2012 • iPhone 开发 → asihttprequest, Objective-C, request A ...

最新文章

  1. DeepMind推出「控制套件」:为「强化学习智能体」提供性能基准
  2. Windows Phone 7第一次亲密接触
  3. 【转】Plotting texts as graphs with R and igraph
  4. 从RocketMQ看长轮询(Long Polling)
  5. SQL多字段模糊查询
  6. java中finalizer终结方法学习心得
  7. A Comprehensive Survey on Graph Neural Networks
  8. 华为智能IP网络,加速联接智能化转型
  9. [BZOJ1834][ZJOI2010]network 网络扩容 最大流+费用流
  10. windows安装mysql5.7
  11. AD16操作技巧笔记
  12. java scjp考试_通过Java认证 SCJP 考试之精辟总结
  13. Android 不透明度对应数值
  14. java界面添加动态背景图片
  15. 科技学术论文润色经验——分享1
  16. docker exec -it container1 /bin/bash 异常
  17. 第四节课 hadoop总结
  18. 58同城字体加密-多套字体文件
  19. Java多线程编程(3)
  20. 基于FPGA平台RISCV架构的SOC应用系统设计1

热门文章

  1. Python编程题:用户登录,三次机会后锁定
  2. 对物联网的感悟_请谈谈你对物联网的看法?
  3. 远景html制造机模板,短视频拍摄脚本设计及文案方案模板
  4. PostgreSQL 用户和角色管理
  5. [IT学习]从网上获取pdf制作vce文件
  6. 【CubeMX配置STM32驱动超声波模块(HC-SR04)】
  7. archlinux 解决蓝牙无法连接问题
  8. [BZOJ4605]崂山白花蛇草水(主席树套kd-tree)
  9. 织梦cms模板下载:广告品牌设计网站织梦模板
  10. 看不懂淘宝特价版,就像之前看不懂拼多多?