简介

本文主要讲解axios的概念和基本使用。

axios时目前最流行的ajax封装库之一,用于很方便地实现ajax请求的发送。

支持的功能:

  • 从浏览器发出 XMLHttpRequests请求。
  • 从 node.js 发出 http 请求。
  • 支持 Promise API。
  • 能拦截请求和响应。
  • 能转换请求和响应数据。
  • 取消请求。
  • 实现JSON数据的自动转换。
  • 客户端支持防止 XSRF攻击。

先借助json-server创建一个简单的服务,供ajax发送请求,json-server是一个简单的可以接收restful的服务。

github地址:https://github.com/typicode/json-server

第一步:安装:npm install -g json-server

第二步:创建一个名为db.json的文件,把网站的数据复制进去。

{"posts": [{ "id": 1, "title": "json-server", "author": "typicode" }],"comments": [{ "id": 1, "body": "some comment", "postId": 1 }],"profile": { "name": "typicode" }
}

第三步:启动命令:json-server --watch db.json

访问http://localhost:3000/posts 下面页面为成功

使用axios

GitHub地址:https://github.com/axios/axios


为了方便,我们直接使用第四种。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>axios基本使用</title>
</head>
<body><button id="btn1">发送get请求</button> <br><br><button id="btn2">发送post请求</button><br><br><button id="btn3">发送put请求</button><br><br><button id="btn4">发送delete请求</button><hr><div>其他发送请求的api:</div><br><br><button id="btn5">发送get请求1</button> <br><br><button id="btn6">发送post请求1</button><br><br><button id="btn7">发送put请求1</button><br><br><button id="btn8">发送delete请求1</button>
</body>
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
<script>//发送getdocument.getElementById("btn1").onclick = function(){axios({method:"GET",url:"http://localhost:3000/posts/1"}).then(response=>{console.log(response);})};//发送postdocument.getElementById("btn2").onclick = function(){axios({method:"POST",url:"http://localhost:3000/posts",data:{title:"axios学习",author:"Yehaocong"}}).then(response=>{console.log(response);})};//发送putdocument.getElementById("btn3").onclick = function(){axios({method:"PUT",url:"http://localhost:3000/posts/2",data:{title:"axios学习",author:"Liaoxiaoyan"}}).then(response=>{console.log(response);})};document.getElementById("btn4").onclick = function(){axios({method:"DELETE",url:"http://localhost:3000/posts/2",}).then(response=>{console.log(response);})};//其他发送请求的apidocument.getElementById("btn5").onclick = function(){//发送get,使用get,第一个参数时url,第二个参数时config配置对象axios.get("http://localhost:3000/posts/1").then(response=>{console.log(response);})};//发送postdocument.getElementById("btn6").onclick = function(){//发送post请求,第一个参数时url,第二个参数时请求体,第三个参数时config配置对象axios.post("http://localhost:3000/posts",{title:"axios学习2",author:"Yehaocong2"}).then(response=>{console.log(response);})};//发送put,document.getElementById("btn7").onclick = function(){//发送put,接收三个参数,url  请求体 、 config配置对象axios.put("http://localhost:3000/posts/2",{title:"axios学习",author:"Liaoxiaoyan"}).then(response=>{console.log(response);})};document.getElementById("btn8").onclick = function(){//发送delete请求,接收2个参数, url config配置对象axios.delete("http://localhost:3000/posts/3").then(response=>{console.log(response);})};//这个与axios({})基本相同// axios.request({// })
</script>
</html>

请求的响应结果结构分析:

配置对象常用的配置项:
{// 路径urlurl: '/user',// 请求方法,默认getmethod: 'get', //基础url,最终请求的url是 baseURL+url拼接,所以再全局设置默认,可以使得发送请求时的url变得简洁baseURL: 'https://some-domain.com/api/',//设置请求头headers: {'X-Requested-With': 'XMLHttpRequest'},//设置请求url的query参数,可以使得url简洁。//比如url是https://some-domain.com/api/user  然后params如下设置,那么最终的url是://https://some-domain.com/api/user?ID=12345&name=Jackparams: {ID: 12345,name:"Jack"},//设置请求体data: {firstName: 'Fred'},//设置请求的另外一种格式,不过这个是直接设置字符串的data: 'Country=Brasil&City=Belo Horizonte',//请求超时,单位毫秒,默认0,不超时。timeout: 1000,//响应数据类型,默认jsonresponseType: 'json', //响应数据的编码规则,默认utf-8responseEncoding: 'utf8',//响应体的最大长度 maxContentLength: 2000,// 请求体的最大长度maxBodyLength: 2000,//设置响应状态码为多少时是成功,调用resolve,否则调用reject失败//默认是大于等于200,小于300validateStatus: function (status) {return status >= 200 && status < 300; },
默认配置

可以设置全局默认配置,是为了避免多种重复配置在不同请求中重复,比如baseURL、timeout等,这里设置baseURL。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>默认配置</title>
</head>
<body><script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script><script>axios.defaults.baseURL="http://localhost:3000";//因为上面配置了baseURL,所以我们之后的请求只需要配置url不用像之前那样的全路径axios.get("/posts/1").then(response=>{console.log(response);})</script>
</body>
</html>

axios拦截器

实质就是函数。
分为两种类型:

  • 请求拦截器:用于拦截请求,自定义做一个逻辑后再把请求发送,可以用于配置公用的逻辑,就不用每个请求都配一遍。
  • 响应拦截器:用于拦截响应,做一些处理后再出发响应回调。
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>axios拦截器</title>
</head>
<body><script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script><script>//这个是设置请求拦截器的api,传入两个回调,第一个成功回调,第二个失败回调。axios.interceptors.request.use(function(config){console.log("请求拦截器1调用成功");return config;},function(error){console.log("请求拦截器1调用失败");return Promise.reject(error)})//这个是设置响应拦截器的api,第一个成功回调,第二个失败回调axios.interceptors.response.use(function(response){console.log("响应拦截器1调用成功");return response;},function(error){console.log("响应拦截器1调用失败");return Promise.reject(error);})axios.get("http://localhost:3000/posts/1").then(function(response){//console.log("请求回调成功");}).catch(function(error){console.log("请求回调失败");})</script>
</body>
</html>

效果:

要理解这些个拦截器需要由一定的es6 Promise基础,出现上面效果的原因是,发送请求前,请求被请求拦截器拦截了,并且请求拦截器返回了一个非Promise实例的对象config,所以下一个拦截器是调用成功回调的,所以就打印响应拦截器成功,然后响应拦截器成功的回调返回的是非Promise实例的对象response,所以最终的请求回调是调用成功的回调,所以返回请求调用成功。

尝试以下再请求拦截器的成功回调中,返回reject状态的Promise。

效果:

出现上面效果的原因是,请求拦截器的成功回调中最后返回了reject状态的Promise实例对象,被判断为失败,到了回调链的下一回调,也就是响应拦截器的回调时,调用的时失败的回调,失败的回调中又返回了reject状态的Promise实例对象,所以到了真正请求的回调页调用了失败回调。

上面的效果与Promise如出一辙。

多个拦截器的效果:加了一个请求拦截器一个响应拦截器:


可以看到请求拦截器类似栈,后进先出,响应拦截器类似队列,先进先出。

可以在请求拦截器中对config进行调整,比如添加一个超时什么的,可以在响应拦截器中对response返回值进行调整,比如我返回到回调函数中只想要响应体部分。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>axios拦截器</title>
</head>
<body><script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script><script>//这个是设置请求拦截器的api,传入两个回调,第一个成功回调,第二个失败回调。axios.interceptors.request.use(function(config){console.log("请求拦截器1调用成功");return config;},function(error){console.log("请求拦截器1调用失败");return Promise.reject(error)})axios.interceptors.request.use(function(config){//设置请求超时时间config.timeout = 5000;console.log("请求拦截器2调用成功");return config;},function(error){console.log("请求拦截器2调用失败");return Promise.reject(error)})//这个是设置响应拦截器的api,第一个成功回调,第二个失败回调axios.interceptors.response.use(function(response){console.log("响应拦截器1调用成功");console.log(response);//返回到请求回调时,只要data数据return response.data;},function(error){console.log("响应拦截器1调用失败");return Promise.reject(error);})axios.interceptors.response.use(function(response){console.log("响应拦截器2调用成功");return response;},function(error){console.log("响应拦截器2调用失败");return Promise.reject(error);})axios.get("http://localhost:3000/posts/1").then(function(response){//console.log("请求回调成功");console.log(response);}).catch(function(error){console.log("请求回调失败");})</script>
</body>
</html>

效果:

取消请求

取消请求就是发送了请求后,等待一段时间得不到回应,可以取消他。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>axios取消请求</title>
</head>
<body><button id="btn1">发送请求</button><button id="btn2">取消请求</button><script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script><script>//第一步:定义一个全局的cancel变量,初始值是nulllet cancel = null;document.getElementById("btn1").onclick = function(){axios.get("http://localhost:3000/posts/1",{//第二步:在请求的配置对象中,配置cancelToken属性值,并把函数的c参数赋值给全局变量cancelcancelToken:new axios.CancelToken(function(c){cancel = c;})}).then(function(response){//console.log(response);}).catch(function(error){console.log("请求回调失败");})}document.getElementById("btn2").onclick = function(){//第三步:调用cancel函数就是取消请求接收cancel();}</script>
</body>
</html>

需要把服务器的响应时间调到3秒,不然太快的话,演示不了取消请求。。

json-server  --watch  db.json -d 3000

axios介绍和使用相关推荐

  1. axios介绍---axios工作笔记001

    我们来学习axios,这个是封装了http请求的,很好用的一个东西.可以看到网址 然后我们要学的东西有,使用方法 以及源码分析,以及我们要仿写一个axios出来. 需要的前置知识,这里需要promis ...

  2. vue axios介绍

    不再继续维护vue-resource,并推荐大家使用 axios 开始,axios 被越来越多的人所了解. axios 是一个基于Promise 用于浏览器和 nodejs 的 HTTP 客户端,它本 ...

  3. axios介绍以及对axios进行二次封装

    目录 一.axios基础 1.什么是axios? 2.axios的安装 3.axios常用配置项 4.axios和ajax的区别 二.使用axios发送请求 1. 发送get无参请求 2. 发送get ...

  4. 前端学习(2959):axios介绍

  5. 前端学习(1487):axios介绍

  6. 一文带领axios初学者走出雾霾的axios详细介绍及基本使用(一)

    目录 axios介绍 axios的引入 axios中get及post请求的基本使用 axios介绍 相信作为一名前端玩家,肯定少不了发送http网络请求的时候.这个时候都会使用浏览器为我们提供的一个A ...

  7. 我是这么使用axios的

    首先在接触前端的时候,用的网络框架是vue-resource,但是看到官网上面上面说这个官网已经不怎么维护了.所以我就转移阵地到axios了.从使用到封装,感觉性能还是挺不错的. 一. axios介绍 ...

  8. ajax async:false不管用_js 网络请求框架 ajax和axios、fetch的区别

    互联网行业发展至今出现了很多技术,技术都在与时俱进的更新中,如从前的前端技术栈(html4+js+css+jquery)到现在vue+axios.随着更多优秀的框架出现,让我们从重复的基础代码编写中解 ...

  9. 记一次axios源码排查

    一.axios介绍 现在社区中有数量庞大的ajax(http)库,为何选择使用axios呢? 首先,因为它提供的API是Promise式的,目前业务代码基本都已经使用async/await来包裹异步a ...

最新文章

  1. cross product
  2. Linux——查看硬件配置命令
  3. VTK:相互作用之Game
  4. 正则汇总 个人汇总 不断更新中
  5. ms查约束具体代码_ECCV 2020附代码论文合集(CNN,图像分割)
  6. 最优化学习笔记(十五)——拟牛顿法(1)
  7. windows查看dll接口
  8. [20160224]-bashELF command not found.txt
  9. Bresenham直线算法与画圆算法
  10. 如何将长截图转换成TXT呢?
  11. 腰围2尺1,2,3,4,5,6,7,8寸分别等于是多少厘米/英寸(对照表)
  12. 泰拉瑞亚服务器怎么让玩家注册,泰拉瑞亚服务器权限指令大全
  13. Spectral Clustering(谱聚类和其他)
  14. 计算机的简单手抄报图片,简单a4手抄报模板设计图
  15. iptables下udp穿越结尾篇----iptables与socks5
  16. android 读取excel表格数据(暂时只支持xls格式)
  17. 阿里云 mysql 1045_解决阿里云登录mysql出现的1045错误
  18. 华科计算机博导刘云生论文,华科白翔老师团队ECCV2018 OCR论文:Mask TextSpotter
  19. 一文搞懂Java8中表示当前的时间类Date、Instant、LocalDateTime、ZonedDateTime
  20. 数控G代码编程详解大全

热门文章

  1. 送一波红包封面,心愿化成祝愿送给大家
  2. Android_003_android应用程序安装后图标不显示
  3. 数据结构——哈希表(Hash表)、哈希碰撞
  4. Js获取最近当日、昨天、近一周、近一月的时间
  5. 安装ECshop2.2版本电商平台
  6. python学习笔记之numpy库的使用——超详细
  7. 如何实现一个虚拟路由器
  8. matlab 结构体查询,Matlab 结构体
  9. python计算机视觉编程——基于BOF的图像检索(附代码)
  10. java基础_面向对象(一)