Vue学习笔记(三) —— 前后端交互
简介
本文主要是为了介绍前端交互的相关知识,而严格来讲,这也不算是Vue
的专属知识,但是却是必须要指定的。本文开始简单说了ajax
、jquery
的方式,但是随着SPA
开发模式的大火,相继出现了一些新的交互方式,而我们应该对这些知识有所了解。此文可以作为后端工程师了解前端交互的入门,对于想要转纯前端的同学应该也有一定的帮助作用。
有兴趣的朋友可以看看之前的两篇文章:
- Vue学习笔记(一)—— 常用特性
- Vue学习笔记(二)—— 组件开发
1、前后端交互模式
1.1 接口调用方式
- 原生
ajax
- 基于
jQuery
的ajax
(主要是基于dom
的操作) fetch
axios
1.2 URL地址格式
1、 传统形式的URL
格式:schema://host:port/path?query#fragment
- schema :协议。例如
http
、https
、ftp
等 - host : 域名或
IP
地址 - port : 端口,
http
默认端口80
,可以省略 - path : 路径,例如
/abc/a/b/c
- query : 查询参数,例如
uname=lisi&age=12
- fragment : 锚点(哈希
hash
),用于定位页面的某个位置
- schema :协议。例如
一个最简单
URL
地址必须包含:协议、域名和端口。端口是可以省略的。
符合规则的
URL
http://www.baidu.com
http://www.baidu.com/java/web
http://www.baidu.com/java/web?flag=1
http://www.baidu.com/java/web?flag=1#function
2、Restful形式的URL
HTTP
请求方式- GET 查询
- POST 添加
- PUT 修改
- DELETE 删除
符合规则的URL地址
http://www.test.com/books
GEThttp://www.test.com/books
POSThttp://www.test.com/books/123
PUThttp://www.test.com/books/123
DELETE
可以看到,有的地址是一样的, 但是它们的提交方式不同。
2. Promise 用法
写在前面
Promise
是ES6中引入的一种新的语法,专门用来处理异步编程。
可以通过一个简单的方式来查看Promise
的对象情况。如下先定义一个html
文件。
<!DOCTYPE html>
<html lang="en">
<head></head>
<body><script>console.dir(Promise)</script>
</body>
</html>
在浏览器中打开上面的html
文件,然后F12
来查看,如下图所示。
2.1 异步调用
异步效果分析
- 定时任务
- Ajax
- 事件函数
多次异步调用的依赖分析
- 多次异步调用的结果顺序不确定
- 异步调用结果如果存在依赖需要嵌套
关于异步依赖需要嵌套,可参考以下代码:
$ajax({success: function(data){if(data.status ==200){$ajax({success: function(data){if(data.status ==200){$ajax({success: function(data){if(data.status == 200){// ....}}});}}});}}
});
如果需要嵌套18层,那就是地狱了。所以这种写法也叫“回调地狱”。为了解决这个问题,所以引入了
Promise
。
2.2 Promise 概述
Promise
是异步编程的一种解决方案,从语法上讲,Promise
是一个对象,其实它也是一个函数,从它可以获取异步操作的消息。
使用Promise
主要有以下好处:
- 可以避免多层异步调用嵌套问题(回调地狱)
Promise
对象提供了简介的API
,使得控制异步操作更加容易
了解更多内容,可到 此处 查看。
2.3 Promise 基本用法
实例化
Promise
对象,构造函数中传递函数,该函数中用于处理异步任务resolve
和reject
两个参数用于处理成功和失败两种情况,并通过p.then
获取处理结果
语法如下:
var p = new Promise(function(resolve,reject){// 成功时调用 resolve()// 失败时调用 reject()
});p.then(function(ret){// 从resolve得到正常结果
},function(ret){// 从reject得到错误信息
});
2.4 基于Promise 处理Ajax请求
1、处理原生Ajax
function queryData(){return new Promise(function(resolve,reject){var xhr = new XMLHttpRequest();xhr.onreadystatechange = function(){if(xhr.readyState != 4){return;}if(xhr.readyState == 4 && xhr.status == 200){resolve(xhr.responseText);} else {reject('出错了');}}xhr.open('get','/data');xhr.send(null);});return p;
}// 调用
queryData('http://localhost:3000/data').then(function(data){console.log(data);},function(data){console.log(data)})
2、发送多次Ajax请求
queryData().then(function(data){return queryData();}).then(function(data){return queryData();}).then(function(data){return queryData();});
通过多个
then
的方式,悠雅的解决了ajax
的回调地狱问题。
2.5 then参数中的函数返回值
1、返回Promise
实例对象
- 返回的该实例对象会调用下一个
then
2、返回普通值
- 返回的普通值会直接传递给下一个
then
,通过then
参数中函数的参数接收该值
2.6 Promise 常用的 API
1、实例方法
p.then()
得到异步任务的正确结果p.catch()
获取异常信息p.finally()
成功与否都会执行(尚且不是正式标准,也许你看到本文时已经是了)
演示代码如下
queryData().then(function(data){// 这里处理的是resolve方法// 如果添加第二个函数,处理的是reject方法console.log(data);}).catch(function(data){// 这里处理的是 reject 方法// 所以catch 相当于then 的第二个参数,这种说法不可取,但是可以这里理解console.log(data);}).finally(function(){console.log('finished');});
2、对象方法
Promise.all()
并发处理多个异步任务,所有任务都执行完成才能得到结果Promise.race()
并发处理多个异步任务,只要有一个任务完成就能得到结果
大体的语法如下:
Promise.all([p1,p2,p3]).then((result) => {console.log(result)
})Promise.race([p1,p2,p3]).then((result) => {console.log(result)
})
3、接口调用 - fecth用法
3.1 fecth 概述
1、基本特征
更加简单的数据获取方式,功能更强大、更灵活,可以看做是
xhr
(传统的ajax
)的升级版基于
Promise
实现
2、语法结构
fetch(url).then(fn2).then(fn3)....catch(fn)
具体内容可以查看官网API。
3.2 fecth 的基本用法
fetch('/abc').then(data => {// text() 方法是fetch API的一部分,返回一个Promise对象,用于获取后台返回的数据return data.text();
}).then(ret => {// 注意这里得到的才是最终的数据console.log(ret)
})
3.3 fecth 请求参数
1、常用配置选项
- method(String):
HTTP
请求方法,默认为GET
(GET、POST、PUT、DELETE
) - body(String):
HTTP
的请求参数 - headers(Object):
HTTP
的请求头,默认为{}
代码的风格如下:
fetch('/abc',{method: 'GET'
}).then(data => {return data.text();
}).then(ret => {// 注意这里得到的才是最终的数据console.log(ret);
})
2、GET请求方法的参数传递
- 传统的参数传递
fetch('/abc?id=123').then(data => {return data.text();
}).then(ret => {// 注意这里得到的才是最终的数据console.log(ret);
})
- RESTFUL风格的参数传递
fetch('/abc/123',{method: 'GET'
}).then(data => {return data.text();
}).then(ret => {// 注意这里得到的才是最终的数据console.log(ret);
})
3、DELETE请求方法的参数传递
fetch('/abc/123',{method: 'DELETE'
}).then(data => {return data.text();
}).then(ret => {// 注意这里得到的才是最终的数据console.log(ret);
})
4、POST请求方法的参数传递
- 第一种用法,
query
查询字符串
fetch('/books',{method: 'POST',body:'uname=lisi&pwd=123',headers: {'Context-Type':'application/x-www-form-urlencoded',}
}).then(data => {return data.text();
}).then(ret => {// 注意这里得到的才是最终的数据console.log(ret);
})
结果如下图所示
- 第二种用法,
json
格式
fetch('/books',{method: 'POST',body: Json.stringify({'uname': 'lisi",'pwd': '123'}),headers: {'Context-Type':'application/json',}
}).then(data => {return data.text();
}).then(ret => {// 注意这里得到的才是最终的数据console.log(ret);
})
结果如下图所示
5、PUT请求方法的参数传递
// 和post的用法基本一样,这里需要传递修改数据的id
fetch('/books/123',{method: 'POST',body: Json.stringify({'uname': 'lisi",'age': 23}),headers: {'Context-Type':'application/json',}
}).then(data => {return data.text();
}).then(ret => {// 注意这里得到的才是最终的数据console.log(ret);
})
PUT 和 POST 一样,都可以使用两种方式来处理请求。
3.4 fecth 响应结果
响应数据格式
- text():将返回体处理成字符串类型
- json():返回结果和
JSON.parse(responseText)
一样
fetch('/abc').then(data => {// return data.text();return data.json();
}).then(ret => {// 注意这里得到的才是最终的数据console.log(ret);
})// 和下面的效果相同
fetch('/abc').then(data => {return data.text();
}).then(ret => {// 注意这里得到的才是最终的数据var obj = JSON.parse(ret)console.log(obj);
})
4、接口调用 - axios用法
4.1 axios 的基本特性
axios(官网:https://github.com/axios/axios)是一个基于Promise
用于浏览器和node.js
的HTTP
客户端。
主要有以下特性:
- 支持浏览器和
node.js
- 支持
Promise
(Promise
的语法都可以直接使用) - 能拦截请求和相应
- 自动转换
JSON
数据
4.2 axios 的基本用法
基本形式如下:
axios.get('/adata').then(ret => {// data属性名称是固定的,用于获取后台相应的数据console.log(ret.data)})
4.3 axios 的常用API
GET
查询数据POST
添加数据PUT
修改数据DELETE
删除数据
4.4 axios的参数传递
1、GET传递参数
- 通过
URL
传递参数
// 传统传参
axios.get('/adata?id=123').then(ret => {console.log(ret.data)})// Restful形式传承
axios.get('/adata/123').then(ret => {console.log(ret.data)})
- 通过
params
选项传递参数
// params 参数是axios专门提供的
// 比较推荐这种方式
axios.get('/adata',{params: {id:123}
}).then(ret => {console.log(ret.data)
})
2、DELETE传递参数
- 参数传递方式和
GET
类似
// 传统传参
axios.delete('/adata?id=123').then(ret => {console.log(ret.data)})// Restful形式传承
axios.delete('/adata/123').then(ret => {console.log(ret.data)})// params 参数传参
axios.delete('/adata',{params: {id:123}
}).then(ret => {console.log(ret.data)
})
3、POST传递参数
- 通过选项传递参数(
默认传递的是json格式的数据
)
axios.post('/adata',{uname:'tom',pwd:123
}).then(ret => {console.log(ret.data)
})
- 通过
URLSearchParams
传递参数(application/x-www-form-urlencoded
)
URLSearchParams
是axios
提供的标准API
const params = new URLSearchParams();
params.append('param1','value1');
params.append('param2','value2');
axios.post('/api/test',params).then(ret => {console.log(ret.data)
})
4、PUT传递参数
- 参数传递方式和
POST
类似
axios.put('/adata/123',{uname: 'tom',pwd: 123
}).then(ret => {console.log(ret.data)
})
4.5 axios 的响应结果
响应结果的主要属性
data
:实际响应回来的数据headers
:响应头信息status
:响应状态码statusText
:响应状态信息
axios.post('/axios-json').then(ret => {console.log(ret)
})
4.6 axios 的全局配置
axios.defaults.timeout = 3000;
// 超时时间axios.defaults.baseURL = 'http://localhost:3000/app';
// 默认地址axios.defaults.header['mytoken'] = 'ogerindxq345348usdgq34498tu';
// 设置请求头
4.7 axios 拦截器
1、请求拦截器
在请求发出之前设置一些信息,代码如下:
// 添加一个请求拦截器
axios.interceptors.request.use(function (config) {// 在请求发出之前进行一些消息设置return config;
},function(err) {// 处理响应的错误消息
});
2、响应拦截器
在获取数据之前对数据做一些加工处理,代码如下:
// 添加一个响应拦截器
axios.interceptors.response.use(function (res) {// 在这里对返回的数据机进行处理// res不是实际的数据对象,通过res.data获得实际数据return res;
},function(err) {// 处理响应的错误消息
});
接口调用 - async/await 用法
5.1 async/await 的基本用法
- async/await是
ES7
引入的新语法,可以更加方便的进行异步操作 - async关键字用于函数上(
async
函数的返回值是Promise
实例对象) - await关键字用于async函数当中(
await
可以得到异步的结果)
async function queryData(id) {const ret = await axios.get('/data');return ret;
}queryData.then(ret => {console.log(ret)
})
通过
async
和await
关键字,可以使代码更简洁,因为不需要使用then
函数。另外,async
返回Promise
对象,可以使用then
继续处理,如上面的参考代码所示。
5.2 async/await 处理多个步请求
多个异步请求的场景
async function queryData(id) {const info = await axios.get('/async1');const ret = await axios.get('async2?info=' + info.data);return ret;
}queryData.then(ret => {console.log(ret)
})
总结
以上就是关于前端交互的基本知识总结。算是系统学习前端交互知识的一次总结,也是当前SPA
开发所必须的知识,同时还方便以后的再次学习。下一篇将介绍的是路由的相关知识,有兴趣可以看看。
Vue学习笔记(三) —— 前后端交互相关推荐
- VUE基础学习笔记——04前后端交互
一.URL 地址格式 1.传统形式的 URL 格式:schema://host:port/path?query#fragment (1) schema:协议(http.https.ftp等) (2) ...
- ajax学习----json,前后端交互,ajax
json <script>var obj = {"name": "xiaopo","age": 18,"gender& ...
- SpringCloud学习笔记018---SpringBoot前后端分离_集成_SpringSecurity_简单实现
SpringBoot前后端分离_集成_SpringSecurity_简单实现 1.新建SpringBoot项目,可以使用idea,快速创建 file-create-project->选择w ...
- python如何实现前后端交互_笔记 | 实现前后端交互的方法
前端工程师的职责:1.UI重构 2.在正确的区域渲染出服务端的数据. 毕竟,我们要构建一个大的web应用,必然不是普普通通的静态页面构成. 下文将罗列前端工程师应该必备的同后端打交道的常用技能. 1. ...
- 前端基础:vue(四)前后端交互promis、fetch、axios
接口调用方式 原生ajax 基于jQuery的ajax fetch axios URL格式地址 格式:schema://host:port/path?query#fragment schema:协议. ...
- Vue学习笔记三(组件间通信)
主要通信方式包括: 1.props属性 父---->子,子传父也可以通过方法实现,传递的可以是一个数据对象,或者一个方法,是方法的时候子组件调用该方法,通过传参方式将数据传递给父组件. < ...
- 前后端交互(小白教学)
在我们的印象中什么是前后端交互呢? 我们一个后端程序员为什么要去学习前端知识? 前后端交互到底是靠什么而进行关联的呢? 接下来我们带着这三个问题来阅读这边文章!!! 1.前后端交互 所谓前后端交互,即 ...
- vue学习笔记-01-前端的发展历史(从后端到前端,再到前后端分离,再到全栈)
vue学习笔记-01-前端的发展历史(从后端到前端,再到前后端分离,再到全栈) 这篇文章是博主在看vue-前端发展简史的时候做的笔记,以供后续学习复习 文章目录 vue学习笔记-01-前端的发展历 ...
- JavaScript 学习笔记(八)前后端交互;Ajax进行前后端交互
目录 一.前后端 二.前后端接口 三.Ajax 1. ajax接口步骤 2. 返回为json格式 四.请求方式 五.案例:登录 一.前后端 前端:用户可以看见的界面,我们一般浏览网页时看到的界面,展现 ...
最新文章
- 写出漂亮 Python 代码的 20条准则
- 18计算机二级考试用word吗,计算机二级Word篇-实操真题详解18
- Java多线程(二)——多线程基本特性
- window Anaconda安装tensorflow cpu版本与keras安装版本
- asp.net core 系列 3 依赖注入服务
- HighCharts (web 页面的图表框架)
- ArcGIS Server 发布 REST 服务
- 做了一个收录 rss opml 文件的仓库,欢迎推荐 opml
- 2019.11.28
- 在 PDF 中添加文本的 3 种简单方法
- 使用假设检验分析PS4,XBox,Switch 谁是最好的游戏主机
- dboxShare企业网盘系统开源源码
- tarjan——割点
- 【刷题记录1】算法|数据结构|C/C++
- Git - remove pushed file
- 使用Charles进行手机抓包
- 【尖端干货】星域CDN极速高清技术详解
- MySQL 修改时返回受影响行数为 0
- shell编程-使用complete实现linux命令自动补全
- uipath split用法
热门文章
- 判断release模式_AbstractQueuedSynchronizer共享模式与基于Condition的等待/通知
- c++语言截取字符串,C/C++知识点之C语言截取字符串
- 圣诞节平面设计师排版|首选手写字体素材,简单但非常好用。
- PNG免抠软装素材,每个设计师都应该备一份!
- win系统流畅度测试软件,视频对比:老电脑装Win7、Win10流畅性测试
- java bytebuffer 读写_java nio bytebuffer文件读写问题
- arm nodejs_英伟达打算收购Arm,或将成有史以来最大半导体收购案
- 为什么Linux内核常用unsigned long来代替指针
- ethtool 原理介绍和解决网卡丢包排查思路(附ethtool源码下载)
- DPDK examples rxtx_callbacks完全注释