axios基础应用实战

axios是一个基于Promise优秀的HTTP库,也是vue作者推荐配合vue使用的代替vue-resource的库,它比ajax功能要丰富点


        对于axios的学习,大致可以分为三部曲,第一就是基础知识你能够灵活运用,第二就是能够根据自己项目需要封装一下axios库,第三个就是看源码吧,能看得懂,讲的出其道理。今天,我们就讲讲axios的基础应用。


前期工作

基础知识梳理

    一个基于Promise的HTTP库

    前后端double kill, 前端用于浏览器发送XMLHttpRequest请求,后端可以于Node.JS的http请求

    最新的浏览器它都支持,这里不要再提IE6、7、8了,忘了它们吧,前端已经放弃IE了

    支持拦截请求和响应

    可以取消请求哦

    客户端支持CSRF

    自动转换JSON数据

    转换请求数据和响应数据

    能进行多请求操作

    坑,也是有的

从楼上的知识梳理可以看到,它具备了很多ajax不具备的功能,一个字 “强”。

跨域问题

        跨域是浏览器的同源策略造成的。那么什么是同源策略呢?同源策略是浏览器的一种安全机制,它会阻止一个域的Javascript脚本和另一个域Javascript脚本进行交互。再深究下去,那么什么又是同源呢?就是两个页面具有相同的协议、主机和端口号。

        就是说你一个http协议的去请求https协议的,浏览器是部批准的;你同协议同主机下一个8080请求8090的也是不被浏览器批准的,同协议同端口,但是你一个是域名,一个是域名A记录的ip地址,这浏览器也是不批准的。

        解决跨域问题的关键,还是要理清前端可以做什么?后端可以做什么?例如后端可以用反向代理给它代理到不跨域的地方,也可以设置请求头进行解决,前端的script脚本天然无跨域,你可以引用,所以这也JSOUP可行的原因。

axios全局配置

        axios的配置可以分为全局和局部的,这里把全局的拎出来讲,因为这个在后面实战部分不会涉及到,全局的话适合那种单页面改动不大的,很多项目还是要具体问题具体分析,所以这里就带一下,大致有楼下配置较为常见。

axios的实例

        这个在后面实战部分也不会涉及,所以这里单独拎出来讲。我举个例子吧,就是像正常我们访问网站可以是http协议也可以是https协议,其中https协议要比http协议多设置一些参数,因为它是有证书的,会遇到unable to verify the first certificate这样的错误,所以实例的作用就很明显了,按照具体的需求配置实例请求相应的接口作交互。

axios的拦截器

        这个也要拎出来讲,在后面实战不涉及。你可以在then和catch之前拦截请求和响应。

错误处理

        这块在实战部分也不涉及,就是说在我们进行axios操作的时候,可能会遇到一些错误,例如我发出去了但是没响应,后台响应了但是不是2xx开头的,还有一些因为网络等原因的错误啦,所以进行错误处理很有必要。

        你可以用validateStatus定义一个http状态码返回的范围,超过的老哥我不要了。

取消请求

        这个笔者到现在的项目也没有遇到过这种应用场景,所以暂作了解吧,有个API是CancelToken.source可以完成这个操作。

后端服务器约定

        笔者在自己的腾讯云学生机上基于Express封装了一些接口用于楼下的实验。比较大的感触就是arr.forEach()这个数组的API在项目尽量少用吧,效率太差了。

请求的域名: bh.zhijiangtao.xin

请求的IP地址:49.234.189.222

请求的协议:http

CDN地址

        这里后面要演示,笔者就是图个方便,所以用CDN来进行包库引入,这里整理下几个可还行的,读者任选其一即可。

```html

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

<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>

<script src="https://cdn.bootcss.com/qs/6.5.2/qs.min.js"></script>

```

实战演示

        关于实战部分,大致是如下内容,请求某接口返回近日某些网站热门话题数据;对于人员信息进行增删改查以及对跨域的演示。这里我们就先对界面没有想法了,后续再完善吧,不要求界面做的花里胡哨了,侧重点在数据的交互上面, 就意思下。

演示环境搭建

        打开VSCode,去插件下载Live server,到时候我们就用它来起一个服务,初学者怎么简单怎么来吧。

        新建一个index.html文件如图:

        然后我们新建一个js文件夹,然后再新建index.js文件。

案例一: 获取网站热门话题

请求地址: http://bh.zhijiangtao.xin:3000/axios

请求方法: GET

请求参数:name(String)


        响应参数 :如图所示

        写到这里我们就可以进行测试了,如果你按照我楼上说的已经在vscode安装了live server,那么请点击一下vscode右下角的Go Live,如果你没有改动的话,它会打开浏览器跳转到本机5500端口并打开页面,我们打开控制台看输出,发现是这样的。


        楼上这幅图,巧妙地印证了我最开始总结的,axios会进行数据转换和JSON化,这就带来一个问题,比如说我这里想取到数据data里面的内容的话,就要是wb.data.data这样才是我们期望的,感觉有点别扭,有点冗余的感觉,这里我特此暴露出来希望大家注意,开发的时候前后端最好先讲好吧,采用什么技术,数据怎么定义,而不是一拍脑袋在做事。这里有兴趣的同学可以自己创建下,也可以结合小程序啊啥的自己搞个页面,反正API在这里了。

案例二:跨域的演示

请求地址:http://bh.zhijiangtao.xin:3000/axios/jbrnk

请求方法:GET

请求参数:无

响应参数:如图

        这里我在后台做了个处理,所以浏览器打开是没问题的,但是用axios会有个跨域问题的错误,演示下吧。

        代码如下:

        具体的效果如下:

        可以看到它直接挂了,不可能往下执行打出那句"我跨域了。。。",这个故事告诉我们,跨域问题的根本是浏览器的同源策略,但是解决方案应该交由后端去做,当然前端也有在做的部分。

案例三:基于用户信息的增删改查

请求地址:http://bh.zhijiangtao.xin:3000/axios/user

请求方法:GET、POST、PUT、DELETE

请求参数:楼上的请求方法分别对应增删改查一部分,参数这边我们统一用id进行删和改,增加的话只要姓名name,年龄age,状态status就好,查询的话不做要求就是意思下。

查询所有用户信息(GET)

        具体的代码如下:

        篇幅问题,不再打开浏览器演示了,请读者自行打开控制台观摩。

        后面的是重头戏,你会发现用axios进行POST、PUT、DELETE等操作,这类非简单请求时,会进行OPTIONS预检请求。

添加用户信息(POST)

        可以看到添加成功后的效果

        后面就是比较蛋疼的事情发生了。

更新用户信息(PUT)&&删除用户信息(DELETE):卒

        我先说下过程吧,后台我是设置了允许跨域的,所有接口都用postman跑了一遍,但是放到实现的前端逻辑上,浏览器打开不知为何还是跨域了,查阅了一些资料无果,恕笔者目前水平有限,暂时还是解决不了这个问题,如果哪位读者有什么高见欢迎与笔者联系探讨。

        我们简要的分析下上面这个问题,可以确定的是后端的接口应该是没有问题的,那么问题就出在前端的跨域上,放到代码上去也就是axios的发送put和delete请求的代码的书写上吧,暂时只能推理到这步,初步推测可能缺少一些请求头设置吧。因此我们思考这样一个开发问题,就是后端在接口写好时并用Postman测试可行,把接口给了前端,然后前端不管是用AJAX还是Axios都跨域了,这个时候前端就跑去问后端,你这个接口有问题啊!那么问题来了,前端怎么有理有据地去纠正这个想法呢?我先来一个吧!兄弟,放弃postman吧,改用postwomen。postman又不是浏览器,不存在跨域问题,所以问题自然发现不了,这个是需要注意的一个点。

        以下是我的前端逻辑部分代码

        既然这样,老哥,那我就先不跨了,最开始我们不是说axios是一个基于Promise的HTTP库,放到前台就是浏览器的xhr请求,放到后台就是node.js的request请求,好,那我们就去后台验证结果。

        附上我的代码:

        我们更新id为2的那条记录,然后删除id为1的记录,可以看到它是可以进行更新和删除的

        以上就是本次实验的全部内容,大致是阅读完axios基础部分设计的一些例子,希望能够帮助读者更好地掌握这块的知识吧。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,444评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,421评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,363评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,460评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,502评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,511评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,280评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,736评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,014评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,190评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,848评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,531评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,159评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,411评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,067评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,078评论 2 352

推荐阅读更多精彩内容

  • 面试题一:https://github.com/jimuyouyou/node-interview-questio...
    R_X阅读 1,615评论 0 5
  • 前端开发面试题 面试题目: 根据你的等级和职位的变化,入门级到专家级,广度和深度都会有所增加。 题目类型: 理论知...
    怡宝丶阅读 2,576评论 0 7
  • 题目1.什么是同源策略? 同源策略(Same origin Policy): 浏览器出于安全方面的考虑,只允许与本...
    FLYSASA阅读 1,717评论 0 6
  • @charset "utf-8";h1,h2,h3,h4,h5,h6,body,hr,p,dl,dt,dd,ul,...
    Simon_s阅读 528评论 0 0
  • 什么是Embedding嵌套? 下面是谷歌官方定义:一种分类特征,以连续值特征表示。通常,嵌套是指将高维度向量映射...
    zhyuzh3d阅读 2,233评论 0 3