8.Vue技术栈开发实战-Ajax请求实战

node服务端

node服务端代码:https://github.com/lison16/vue-cource/tree/master/server

npm install先安装依赖。然后npm run start即可访问端口是3000

http://localhost:3000/

把下面这段代码注释掉,然后就可以正常访问了,要不然这里就把请求拦截掉。

 

注意这是个post请求,地址在浏览器上无法直接访问的,浏览上直接访问的是get请求。所以这里用了postMan来模拟post请求

http://localhost:3000/index/getUserInfo

 

{
    "code": 200,
    "data": {
        "name": "Lison"
    }
}

 

本节课程


添加全局的拦截器,对全局的请求拦截,做一些全局的通用的处理。结合Node服务演示真实的node请求

跨域


通过devServer的proxy来设置跨域。

我们在本地开发的时候,通过vue server起一个本地的开发服务,这个服务一般是localhost,然后端口一般是8080.如果我们在本地启一个node服务,它的端口肯定和我们前端的端口是不一样的。同域名不同端口也是存在跨域的问题。
在这里设置代理,它会把我们所有的接口代理到目标url下


后端通过设置header值来实现跨域。
*设置允许访问的域,所有ip都可以访问,就不存在跨域了。

设置允许的header

最后设置允许的方法

开始代码

添加一个按钮请求数据
需要先安装axios

npm install axios -S



服务端的代码的接口。post请求,getUserInfo

返回code为200然后一个data

vue前端的代码,请求方法 getInfo:传递一个userId。请求的地址注意:应该是:/index/getUserInfo

跨域我们先关掉

服务端的允许跨域也先注释掉



打开这个代理。端口改成3000 这是后端的node服务的端口。修改了配置文件要冲入前端服务。npm run serve







不设置代理

请求的地址写成完整的



前端不设置代理,后端可以添加三个header来解决跨域问题。为所有的请求,都添加这三个header。最后需要调用next()才能往下执行。

成功请求了。前端没有做代理也可以了。

这就是常用的两种解决跨域的方式。

封装axios

lib下添加axios.js

以类的形式来封装,然后把它导出。

首先定义一个constructor构造方法,这是类必须的方法。如果这里我们不定义的话,他会默认添加一个空的constructor

构造函数加个参数,创建实例的时候,可以在初始化的传入参数,可以在constructor里面可以做一些操作。

请求的基础路径。在config内配置。判断如果是开发环境默认这里为空,并设置代理

然后代理的这个地方设置服务端的Url

如果配置文件内没有配置代理的话。那么就在config内写服务端的url

URL改成大写的


引入baseURL然后constructor内接收

ES6的默认值,相当于是这么写

ES6的写法就简便的多了

再设置一个队列,是个空对象

再来封装一个方法request,创建一个axiso的实例,

options需要做一个合并。用ES6的assign方法对配置进行合并。


可以在内部设置一个全局的配置,使用方法的形式。
使用Object.assign会把这两个对象合并成一个对象,如果有相同的属性,会用后面的对象的属性名去改前面的。

返回这个实例,并传入options

全局中的配置写在getInsideConfig内。baseUrl可以在这设置,然后可以添加一些全局的header

注意事项1

最新的eslint标准,方法和方法之间 要加一个空行

拦截器

全局请求和相应的拦截。

首先来添加一个请求拦截器,在use里面我们传入两个回调函数。

第二个互调函数就是error

直接返回一个promise的reject

可以在这个地方添加一些请求前的控制。比如我们在iview中,有个Spin组件,它能够在浏览器显示全局的loading。它有个遮罩层,是无法点击页面进去操作的。在这里显示数据加载中........



最后把这个config。return出去,请求它就会继续

响应拦截器

第一个参数是服务端给你返回的东西。

第二个参数也是error

在api里面我们创建一个index.js

创建HttpRequest的实例,并把这个实例导出去。

在api里面创建user.js

首先引入这个httpRequest的实例



调用api封装的请求

用这个方法返回的是一个Promise。打印出这个结果

这里我们也可以传入一个参数



可以在api层进行接收,ES6的解构赋值,

post的请求是需要放在data里的

相当于这种写法

 输姓名和变量名相同就可以省略的写法


测试


request拦截里面,把config也打印出来

这个就是我们的请求拦截,里面标注的请求的所有配置


之前我们在这里创建了Spin.show就是显示loading层,每一个请求会显示loading的层,它就会在全局创建很多个全局的loading效果。

所以这个时候,我们就用到了队列

我们通过队列把每一个请求,加入栈里面,那么每一次请求我们把请求的url放进去。当我们这个队列里面没有了请求,说明我们的请求都已经响应完成了。这个时候把全局的loading关掉。当发现队列里面有请求的话,就不需要用这个Spin.show来创建一个loading了。
所以这里我们用队列来做处理

拦截器这里也加上参数url的接收

把url作为对象属性名传进去。值可以随便设置。

Object.keys获取这个队列里面所有的属性名

如果队列的长度大于0的。那么就是一个真值。



成功响应了。使用delete操作符,把这个属性删掉。

如果失败了,也需要删掉

Spin因为我们还没有引入Iview.所以这里先注释掉把


这样我们的axios的封装基本上就完成了。
结果里面我们只用到了data和status 我们用解构赋值,然后只返回他们俩就可以了。




github提交代码记录

结束

 

posted @ 2020-05-20 22:59  高山-景行  阅读(415)  评论(0编辑  收藏  举报