三十六、Vue中的Ajax
大约 3 分钟约 794 字
(一)发送 Ajax 请求
1.请求方式
1)XHR
- JS 内置,可以直接创建 XMLHttpRequest 实例对象
new XMLHttpRequest();
xhr.open();
xhr.send();
2)JQuery
- 核心是 DOM 操作,不适用于 Vue 项目
$.get();
$.post();
3)Axios
- 体积小,约为 JQuery 的 1/4
- Promise 风格,支持响应拦截器、请求拦截器
- Vue 官方推荐
4)Fetch
- 也是 JS 内置,可以直接使用 fetch() 方法
- 也是 Promise 风格
- 返回的数据会封装在两层 Promise 里(需要.then 两次),且有兼容性问题(IE)
5)vue-resource
- 了解即可,vue1.0 常用,起初是 vue 团队维护,后期外包出去,是 vue 中的插件库
- 是对 XHR 的封装
2.解决跨域
1)CORS
- 最标准的解决方式,后端操作
- 在服务器中返回响应时加几个响应头
response.setHeader("Access-Control-Allow-Origin", "*");
2)JSONP
- 借助 script 标签的 src 属性 在引入外部资源时不受同源策略限制 的特性实现【面试常问】
- 开发极其少用,需要前后端一起配置,且只能解决 GET 请求跨域问题
3)配置代理服务器
- 开发常用
- 代理服务器与本地域名、端口保持一致(localhost:8080)
- 前端(localhost:8080)向代理服务器请求数据
- 后端(localhost:5000)把数据交给代理服务器
- 前端请求时不违反同源策略则没有跨域问题
- 代理服务器与后端服务器请求时不用 ajax(ajax 是前端技术),所以不存在跨域问题
- 服务器之间通信用 HTTP 请求
- 开启方式:
- Nginx:较复杂,需后端基础
- Vue-CLI:借助脚手架
相关信息
如果前端请求的资源代理服务器本身就有,那就不会再去请求后端服务器
所以前端请求路径要精确到文件扩展名,如:http://192.168.3.98:8080/students
(二)Vue 脚手架配置代理
1.方法一
1)使用
- 在 vue.config.js 中添加如下配置:
devServer: {
proxy: "http://192.168.3.98:5000";
}
2)说明
- 优点:配置简单,请求资源时直接发给前端(8080)即可
- 缺点:不能配置多个代理,不能灵活地控制请求是否走代理
- 工作方式:若按照上述配置代理,当请求了前端不存在的资源时,那么该请求会转发给服务器(优先匹配前端资源)
2.方法二
1)使用
- 编写 vue.config.js 配置具体代理规则:
/**
* changeOrigin设置为true时,服务器收到的请求头中的Host为:localhost:5000
* changeOrigin设置为false时,服务器收到的请求头中的Host为:localhost:8080
* changeOrigin默认值为true
*/
devServer: {
proxy: {
'/api1': { //匹配所有以'/api1'开头的请求路径
target: "http://192.168.3.98:5000", //代理目标的基础路径
changeOrigin: true,
pathRewrite: {'^/api1': ''},
},
'/api2': { //匹配所有以'/api2'开头的请求路径
target: "http://192.168.3.98:5001", //代理目标的基础路径
changeOrigin: true,
pathRewrite: {'^/api2': ''},
},
}
}
2)说明
- 优点:可以配置多个代理,且可以灵活地控制请求是否走代理
- 缺点:配置略微繁琐,请求资源时必须加前缀