动力节点Vue笔记④ Vue与Ajax

news2024/10/6 8:32:42

四、Vue与AJAX

4.1 回顾发送AJAX异步请求的方式

发送AJAX异步请求的常见方式包括:

原生方式,使用浏览器内置的JS对象XMLHttpRequest

  • const xhr = new XMLHttpRequest()
  • xhr.onreadystatechange = function(){}
  • xhr.open()
  • xhr.send()

原生方式,使用浏览器内置的JS函数fetch

  • fetch(‘url’, {method : ‘GET’}).then().then()

第三方库方式,JS库jQuery(对XMLHttpRequest进行的封装)

  • $.get()
  • $.post()

第三方库方式,基于Promise的HTTP库:axios (对XMLHttpRequest进行的封装)

  • axios.get().then()

axios是Vue官方推荐使用的。

4.2 回顾AJAX跨域

什么是跨域访问?

在a页面中想获取b页面中的资源,如果a页面和b页面所处的协议、域名、端口不同(只要有一个不同),所进行的访问行动都是跨域的。

哪些跨域行为是允许的?

  • 直接在浏览器地址栏上输入地址进行访问
  • 超链接
  • <img src=”其它网站的图片是允许的”>
  • <link href=”其它网站的css文件是允许的”>
  • <script src=”其它网站的js文件是允许的”>
  • ......

哪些跨域行为是不允许的?

  • AJAX请求是不允许的
  • Cookie、localStorage、IndexedDB等存储性内容是不允许的
  • DOM节点是不允许的

AJAX请求无法跨域访问的原因:同源策略

  • 同源策略是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,浏览器很容易受到XSS、CSRF等攻击。同源是指"协议+域名+端口"三者相同,即便两个不同的域名指向同一个ip地址,也非同源。
  • AJAX请求不允许跨域并不是请求发不出去,请求能发出去,服务端能收到请求并正常返回结果,只是结果被浏览器拦截了。

解决AJAX跨域访问的方案包括哪些

① CORS方案(工作中常用的)

  • 这种方案主要是后端的一种解决方案,被访问的资源设置响应头,告诉浏览器我这个资源是允许跨域访问的:response.setHeader("Access-Control-Allow-Origin", "http://localhost:8080");

② jsonp方案(面试常问的)

  • 采用的是<script src=””>不受同源策略的限制来实现的,但只能解决GET请求。

③ 代理服务器方案(工作中常用的)

  • Nginx反向代理
  • Node中间件代理
  • vue-cli(Vue脚手架自带的8080服务器也可以作为代理服务器,需要通过配置vue.config.js来启用这个代理)
  • postMesssage
  • websocket
  • window.name + iframe
  • location.hash + iframe
  • document.domain + iframe
  • ......

代理服务器方案的实现原理

同源策略是浏览器需要遵循的标准,而如果是服务器向服务器请求就无需遵循同源策略的。

 

4.3 演示跨域问题

Vue脚手架内置服务器的地址:http://localhost:8080

可以额外再开启一个其它的服务器,这个服务器随意,例如:node server、Apache服务器、JBOSS服务器、WebLogic服务器、WebSphere服务器、jetty服务器、tomcat服务器......我这里选择的是基于Java语言的一个服务器Tomcat,这个web服务器开启了一个8000端口,提供了以下的一个服务,可以帮助我们获取到一个Bug列表:

http://localhost:8000/bugs/

打开BugList案例的代码,在mounted钩子函数中发送ajax请求,获取bug列表。

vue-cli安装axios库:npm i axios。使用时:import导入axios

以上的访问表示:在8080服务器中发送AJAX请求访问8000服务器,必然会出现AJAX跨域问题:

4.4 启用Vue脚手架内置服务器8080的代理功能

1.简单开启

vue.config.js文件中添加如下配置:

  devServer: {

    proxy: 'http://localhost:8000' // 含义:Vue脚手架内置的8080服务器负责代理访问8000服务器

  }

发送AJAX请求时,地址需要修改为如下:

原理:访问地址是http://localhost:8080/bugs,会优先去8080服务器上找/bugs资源,如果没有找到才会走代理。

另外需要注意的是:这种简单配置不支持配置多个代理。

2.高级开启

支持配置多个代理。  

devServer: {
    proxy: {
      '/api': {
        target: 'http://localhost:8000',
        pathRewrite:{'^/api', ''},
        ws: true, // 支持websocket
        changeOrigin: true // true表示改变起源(让目标服务器不知道真正的起源)
      },
'/abc': {
        target: 'http://localhost:9000',
        pathRewrite:{'^/abc', ''},
        ws: true, // 默认值true
        changeOrigin: true // 默认值true
      }
    }
  }

4.5 使用AJAX改造BugList案例

mounted钩子中发送ajax请求即可。

4.6 Vue插件库vue-resource发送AJAX请求

  1. 安装:npm i vue-resource
  2. import vueResource from ‘vue-resource’
  3. 使用插件:Vue.use(vueResource)
  4. 使用该插件之后,项目中所有的vm和vc实例上都添加了:$http属性。
  5. 使用办法:
  • this.$http.get(‘’).then() 用法和axios相同,只不过把axios替换成this.$http

4.7天气预报

1、实现效果

 2、接口来自:Сurrent weather and forecast - OpenWeatherMap

3、开发者进行注册,获取api key

4、获取当前天气的接口

5、根据城市名字获取经度和纬度的接口

 

6、功能实现要点:

(1)首先实现静态组件

  • App根组件下有两个子组件:Search、Weather

(2)根据城市名获取经度纬度的接口:

  • `http://api.openweathermap.org/geo/1.0/direct?q=${this.cityName}&appid=${apiKey}`
  • 以上红色字体采用了ES6的模板字符串。
  • 经度:const lon = response.data[0].lon
  • 纬度:const lat = response.data[0].lat

(3)获取天气信息的接口:

  • `https://api.openweathermap.org/data/2.5/weather?lat=${lat}&lon=${lon}&appid=${apiKey}`
  • 天气图标:response.data.weather[0].icon
  • 温度:response.data.main.temp
  • 湿度:response.data.main.humidity
  • 风力:response.data.wind.speed

(4)以上免费接口已经在服务端解决了跨域的问题,可以直接用。

(5)兄弟组件之间通信采用全局事件总线。

(6)以上接口返回的图标的id,根据图标id动态拼接图片地址

(7)初次打开页面的时候,不应该显示天气的任何信息,Weather组件应该是隐藏的。

(8)查询天气过程中,显示“正在拉取天气信息,请稍后...”

(9)如果访问的城市不存在时,应该提示“对不起,请检查城市名”

(9)如果出现其它错误一律显示“网络错误,请稍后再试”

(11)在Search组件中触发事件的时候,将多个属性封装为对象的形式(语义化更明确)传给Weather组件。

  • 在Weather组件中可以采用对象的形式一次性接收。
  • 注意结构中的代码:<p class="wind">{{weather.windSpeed}} m/s</p>

(12)ES6语法,合并对象

  • this.weather = {...this.weather, ...weather}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/457714.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RK3568平台开发系列讲解(调试篇)内核函数调用堆栈打印方法汇总

🚀返回专栏总目录 文章目录 一、dump_stack 函数二、WARN_ON(condition)函数三、BUG_ON (condition)函数四、panic (fmt...)函数沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将对驱动调试方法进行汇总学习。 一、dump_stack 函数 dump_stack 作用:打印内核调…

C++、STL标准模板库和泛型编程 ——迭代器、 算法、仿函数(侯捷)

C、STL标准模板库和泛型编程 ——迭代器、 算法、仿函数 &#xff08;侯捷&#xff09; 迭代器iterator_category 算法accumulatefor_eachreplacecountfindsortbinary_search 仿函数 functors(六大部件中最简单的一种&#xff01;) 使用一个东西&#xff0c;却不明白它的道理&a…

Compiler- volatile关键字

为了直观的感受编译器为程序所做的编译优化&#xff0c;我们通过以下的C程序来进行演示&#xff08;只能体现编译优化的一小部分hh~&#xff09;。 请大家预测一下下面代码的输出结果 #include <iostream>int main(void) {const volatile int local 10;int* ptr (int…

中国人民大学与加拿大女王大学金融硕士国际班——海归学子最强后援

有人脉&#xff0c;成功像坐电梯&#xff1b;没人脉&#xff0c;成功像爬楼梯。这是每一个职场人都有体悟的“潜规则”。对海归同学来说&#xff0c;加入母校校友会是结识优秀人才、迅速拓展本地人脉圈的不二法宝。中国人民大学与加拿大女王大学金融硕士国际班为海归学子提供最…

QMS-云质说质量 - 4 为什么有的质量人不属于质量部?

想管理好质量&#xff0c;首先就要把质量人员放在合适的组织架构中。 对人进行管理&#xff0c;基本原则是&#xff1a;尽量让员工的利益与企业的利益保持同步&#xff0c;虽然无法做到完全重合&#xff0c;但出发点肯定要战略一致。 俗话说“屁股决定脑袋”&#xff0c;因此&a…

【数据结构初阶】第六节.队列的实现

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言 一、队列的初步认识 二、Java中队列的使用 三、队列的模拟实现 四、力扣刷题演练 4.1 设计循环队列 4.2 用栈实现队列 4.3 最小栈 总结 前言 今天我…

日撸 Java 三百行day36

文章目录 day36 领接表1. 领接表知识点2.结合上图去抽象一个邻接表结点的对象3.广度优先遍历4.深度优先遍历 #说明 闵老师的文章链接&#xff1a; 日撸 Java 三百行&#xff08;总述&#xff09;_minfanphd的博客-CSDN博客 自己也把手敲的代码放在了github上维护&#xff1a;h…

Vue3+Three.js+antvG2实战项目 智慧城市(三)

前言 在网上找了很久都没有找到使用Three.js开发智慧城市的免费文章或者免费视频,自己花了一点时间做了一个纯前端的智慧城市项目。 技术栈都是最新的:vue3vitetypeScriptThreeantv G2 源码分享 源码 模型,天空图盒子链接分享(不想下载源码可以只用下这个)提取码1234 20230424_…

【iOS】—— KVC再学习

KVC 文章目录 KVCKVC常用的四种方法 key和keyPath的区别用法&#xff1a; 批量存值操作批量赋值操作字典模型相互转化KVC的其他方法 KVC原理探索setValue:forKey: 的原理&#xff08;KVC赋值原理&#xff09;valueForKey:的原理&#xff08;KVC取值原理&#xff09; 注意事项 K…

C++数据结构:手撕AVL树

目录 一. 什么是AVL树 二. AVL树的节点定义 三. AVL树的插入操作 3.1 寻找插入位置 3.2 更新平衡因子 3.3 AVL树的旋转调整 3.4 AVL树插入操作的整体实现 四. AVL树的检验 附录&#xff1a;AVL树的实现完整代码 AVL树定义代码 -- AVLTree.h AVL树检验代码 -- test.…

你了解PostProcessor机制吗?

Spring框架对于后置处理器的最佳实践 PostProcessor译为后置处理器&#xff0c;大多数开发人员都使用过springboot对后置处理器的实例级别实践&#xff0c;也就是BeanPostProcessor接口。其实spring还提供了两种容器级别的实践&#xff1a;BeanDefinitionRegistryPostProcesso…

今天试了试chatgpt

今天试了试chatgpt&#xff0c;真是服了 arcade&#xff1f; Arcade是一个Python游戏开发库&#xff0c;它提供了一系列的工具和函数&#xff0c;可以帮助开发者快速地创建2D游戏。以下是Arcade的一些特点&#xff1a; 简单易用&#xff1a;Arcade提供了简单易用的API&#x…

egg3.0连接egg-mongoose插入一条数据、插入多条数据

插入一条数据 app/router.js use strict;/*** param {Egg.Application} app - egg application*/ module.exports app > {const { router, controller } app;router.get(/, controller.home.index);router.get(/role, controller.role.index);router.post(/role/add, co…

【ChatGPT】如何用十分钟部署一个属于自己的chatgpt网站

&#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是Zeeland&#xff0c;全栈领域优质创作者。&#x1f4dd; CSDN主页&#xff1a;Zeeland&#x1f525;&#x1f4e3; 我的博客&#xff1a;Zeeland&#x1f4da; Github主页: Undertone0809 (Zeeland) (github.com)&…

【两个月算法速成】day03-链表

目录 203. 移除链表元素 题目链接 思路 代码 206. 反转链表 题目链接 思路 代码 总结 203. 移除链表元素 题目链接 力扣 思路 如下图所示就是移除链表的过程 但是值得注意的是&#xff0c;移除头节点和其他位置的节点是不一样的&#xff0c;以为头结点前面没有节点。…

每日学术速递4.24

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV 1.Collaborative Diffusion for Multi-Modal Face Generation and Editing(CVPR 2023) 标题&#xff1a;多模态人脸生成和编辑的协同扩散 作者&#xff1a;Ziqi Huang, Kelvin C.K. …

Vue3进阶使用详解(node.js、Vue3路由基础项目、axios的使用详细(实现数据分页---前后端分离)、axios加载失败)

Vue3进阶使用详解(node.js、Vue3路由基础项目、axios的使用详细(实现数据分页—前后端分离)、axios加载失败) Vue cli CLI是Commond-Line Interface&#xff0c;翻译为命令界面&#xff0c;又称脚手架。VueCLI是一个官方发布vue.js项目脚手架。使用VueCLI可以快速搭建vue开发…

【IAR工程】STM8S基于ST标准库读取DHT11数据

【IAR工程】STM8S基于ST标准库读取DHT11数据 ✨申明&#xff1a;本文章仅发表在CSDN网站&#xff0c;任何其他网站&#xff0c;未注明来源&#xff0c;见此内容均为盗链和爬取&#xff0c;请多多尊重和支持原创!&#x1f341;对于文中所提供的相关资源链接将作不定期更换。&…

HTTP协议 GET和POST区别 请求响应 Fiddler postman ajax

&#x1f496; 欢迎来阅读子豪的博客&#xff08;JavaEE篇 &#x1f934;&#xff09; &#x1f449; 有宝贵的意见或建议可以在留言区留言 &#x1f4bb; 欢迎 素质三连 点赞 关注 收藏 &#x1f9d1;‍&#x1f680;码云仓库&#xff1a;补集王子的代码仓库 不要偷走我小火…

Mac下nvm安装使用

​欢迎光临我的博客查看最新文章: https://river106.cn 1、简介 nvm 是 Mac 下的 node.js 管理工具。可以通过 nvm 安装和切换不同版本的 node.js。 官网&#xff1a;https://nvm.uihtm.com/ github&#xff1a;https://github.com/nvm-sh/nvm 2、安装 curl -o- https://raw…