动力节点Vue笔记——第四章Vue与Ajax

news2025/1/21 9:22:01

四、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/434474.html

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

相关文章

【算法题】2583. 二叉树中的第 K 大层和

题目&#xff1a; 给你一棵二叉树的根节点 root 和一个正整数 k 。 树中的 层和 是指 同一层 上节点值的总和。 返回树中第 k 大的层和&#xff08;不一定不同&#xff09;。如果树少于 k 层&#xff0c;则返回 -1 。 注意&#xff0c;如果两个节点与根节点的距离相同&…

Android kotlin 用RecyclerView(androidx+BRVAH3.0.6)实现从底部弹出列表对话框(单选/多选)功能

文章目录 一、实现效果二、引入依赖三、实现源码1、实体类2、适配器单选/多选3、框架弹窗AnyLayer单选/多选3、实现视图一、实现效果 二、引入依赖 在app的build.gradle在添加以下代码 1、框架弹窗AnyLayer(github官网):implementation "com.github.goweii:AnyLayer:4.1…

linux(CentOS 6.5) 安装 Oracle 11g步骤

第一步&#xff1a;准备 1、服务器环境&#xff1a; 系统:CentOS 6.5 (Final) x86_64(Py3.7.8) 2、Navcat&#xff1a; 版本16.0.14 - Premium&#xff08;这里数据库管理工具&#xff0c;不限&#xff0c;可以用其他的&#xff09; 3、FinalShell&#xff1a; 版本3.9.2.2&a…

FE_CSS 页面布局之圆角边框 盒子阴影 文字阴影

1 圆角边框 在 CSS3 中&#xff0c;新增了圆角边框样式&#xff0c;这样我们的盒子就可以变圆角了。border-radius 属性用于设置元素的外边框圆角。 border-radius:length;参数值可以为数值或百分比的形式如果是正方形&#xff0c;想要设置为一个圆&#xff0c;把数值修改为高…

2023-04-15 算法面试中常见的链表问题

2023-04-15 算法面试中常见的链表问题 本章的两个基础类如下 链表的节点类。toString()在debug时实时查看链表很有用 /************************************************************ Description : 链表的节点* author : 梁山广(Liang Shan Guang)* date : 2020…

使用Oracle数据库的java程序员注意:不要再使用generated always as identity了!

Identity Columns是在Oracle版本≥12c中的新特性&#xff1a;自增字段 在自增字段后使用以下2种语句的1种即可完成自增&#xff1a; generated by default as identitygenerated always as identity 在userinfo表的基础上&#xff0c;我们来看下区别&#xff1a; 1、使用ge…

VMware vSphere 8.0 Update 1 正式版发布 - 企业级工作负载平台

ESXi 8.0 U1 & vCenter Server 8.0 U1 请访问原文链接&#xff1a;https://sysin.org/blog/vmware-vsphere-8-u1/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org 2023-04-18&#xff0c;VMware vSphere 8.0 Update 1 正式…

V2G模式下含分布式能源网优化运行研究(Matlab代码实现)

&#x1f4a5; &#x1f4a5; &#x1f49e; &#x1f49e; 欢迎来到本博客 ❤️ ❤️ &#x1f4a5; &#x1f4a5; &#x1f3c6; 博主优势&#xff1a; &#x1f31e; &#x1f31e; &#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 …

LAMP架构的配置

一.LAMP概述 1、LAMP的概念 LAMP架构是目前成熟的企业网站应用模式之一&#xff0c;指的是协同工作的一整套系统和相关软件&#xff0c;能够提供动态web站点服务及其应用开发环境 LAMP是一个缩写词&#xff0c;具体包括Linux操作系统、Apache网站服务器、MySQL数据库服务器、…

加速文件传输协议如何工作?

流行的文件传输协议&#xff08;例如FTP / S&#xff0c;SFTP和HTTP / S&#xff09;取决于名为TCP的基础协议。TCP的问题在于&#xff0c;随着网络条件&#xff08;例如延迟和数据包丢失&#xff09;的增加&#xff0c;网络吞吐量会大大降低。这在很大程度上归因于用于确保TCP…

当对象的引用计数为零时

上一篇文章&#xff0c;我提到要避免对象的析构函数被调用两次&#xff0c;有一位读者声称&#xff1a;当对象第一次被构建的时候&#xff0c;它的引用计数应该为 0&#xff0c;在某些时候&#xff0c;例如调用 QueryInterface 的时候&#xff0c;它的 AddRef 方法应该被调用以…

【算法题解】24. 模拟机器人行走

这是一道 中等难度 的题 https://leetcode.cn/problems/walking-robot-simulation/description/ 题目 机器人在一个无限大小的 XY 网格平面上行走&#xff0c;从点 (0, 0) 处开始出发&#xff0c;面向北方。该机器人可以接收以下三种类型的命令 commands &#xff1a; -2 &am…

C++ 引用

什么是引用 引用不是新定义一个变量&#xff0c;而是给已存在变量取了一个别名&#xff0c;编译器不会为引用变量开辟内存空间&#xff0c;它和它引用的变量共用同一块内存空间。&#xff08;语法层面来讲&#xff09; 但在底层实际上引用是开辟空间的&#xff0c;类似于指针 …

大数据能力提升项目|学生成果展系列之八

导读 为了发挥清华大学多学科优势&#xff0c;搭建跨学科交叉融合平台&#xff0c;创新跨学科交叉培养模式&#xff0c;培养具有大数据思维和应用创新的“π”型人才&#xff0c;由清华大学研究生院、清华大学大数据研究中心及相关院系共同设计组织的“清华大学大数据能力提升项…

操作系统前置知识

进程 程序存储在磁盘之中&#xff0c;需要加载内存才能执行&#xff0c;包含堆空间、栈空间、全局和静态变量数据、代码&#xff0c;具体执行效果如下所示&#xff1a; 所谓的进程概念就是操作系统为了执行某个程序为其分配的内存资源&#xff0c;该内存资源并不是连续的&…

【数据结构】二叉树的链式结构(笔记总结)内附递归展开图(炒鸡详细)

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前学习C和算法 ✈️专栏&#xff1a;数据结构 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章对你有帮助的话 欢迎 评论&#x1f4ac; 点赞&…

Web前端基础——盒子模型

&#xff08;1&#xff09;盒子模型的作用&#xff1a; 布局网页&#xff0c;摆放盒子和内容 &#xff08;2&#xff09;盒子模型重要组成部分&#xff1a; 内容区域 - width & height内边框 - padding&#xff08;出现在内容与盒子边缘之间&#xff09;边框线 - border外…

毕业2年,跳槽到下一个公司就25K了,厉害了···

本人本科就读于某普通院校&#xff0c;毕业后通过同学的原因加入软件测试这个行业&#xff0c;角色也从测试小白到了目前的资深工程师&#xff0c;从功能测试转变为测试开发&#xff0c;并顺利拿下了某二线城市互联网企业的Offer&#xff0c;年薪 30W 。 选择和努力哪个重要&a…

建模技能C位秘诀 | 装配式建筑操作技能

剪力墙结构PC构件-预制剪力墙 YUGOU SCHOOL 1、承载力计算&#xff1a;对一、二、三级抗震等级的装配式剪力墙结构&#xff0c;应进行剪力墙水平接缝的抗震受剪承载力验算。 由公式可以看出预制剪力墙水平抗剪主要是靠垂直穿过结合面的竖向抗剪钢筋以及结合面上的轴向压力&a…

RSA-2048-Encoded-Modulus

裸公钥和x509格式公钥的区别 (公钥&#xff0c;非证书) x509 30820122300D06092A864886F70D01010105000382010F003082010A02820101||00 || 256字节的modulus||0203010001 解析: 0203010001 tag length value 结构 &#xff0c;pubExponent 010001 大于7F补 00 &#xff1f;…