URL(全称是JniformResourceLocator)中文叫统一资源定位符,用于标识互联网上每个资源的唯一存放位置。浏览器只有通过URL地址,才能征确定位资源的存放位置,从而成功访问到对应的资源。
常见的URL举例:
UL地址一般由三部组成:
客户端请求服务器时,请求的方式有很多种,最常见的两种情求方式分别为get和post请求。
Ajax的全称是 Asynchronous Javascript And XML(异步JavaScript和XML)。
通俗的理解:在网页中利用XMLHttpRequest对象和服务器进行数据交互的方式,就是Ajax。
之前所学的技术,只能把网页做的更美观漂亮,或添加一些动画效果,但是,Ajax能让我们轻松实现网页与服务器之间的数据交互。
用户名检测:注册用户时,通过ajax的形式,动态检测用户名是否被占用
搜索提示:当输入搜索关键字时,通过ajax的形式,动态加载搜索提示列表
数据分页显示:当点击页码值的时候,通过ajax的形式,根据页码值动态刷新表格的数据
数据的增删改查:数据的添加、删除、修改、查询操作,都需要通过ajax的形式,来实现数据的交互
浏览器中提供的XMLHttpRequest用法比较复杂,所以jQuery对XMLHttpRequest:进行了封装,提供了一系列Ajax相关的函数,极大地降低了Ajax的使用难度。
jQuery中发起Ajax请求最常用的三个方法如下:
jQuery中 . g e t ( ) 函 数 的 功 能 单 一 , 专 门 用 来 发 起 g e t 请 求 , 从 而 将 服 务 器 上 的 资 源 请 求 到 客 户 端 来 进 行 使 用 。 ∗ ∗ ∗ ∗ .get()函数的功能单一,专门用来发起get请求,从而将服务器上的资源请求到客户端来进行使用。** ** .get()函数的功能单一,专门用来发起get请求,从而将服务器上的资源请求到客户端来进行使用。∗∗∗∗.get()函数的语法如下:
$.get(url,【data】,【callback】)
使用$.get()函数发起不带参数的请求时,直接提供请求的URL地址和请求成功之后的回调函数即可,示例代码如下:
<script>
$(function () {
$('button').on('click', function () {
$.get('http://www.liulongbin.top:3006/api/getbooks', function (res) {
console.log(res);
})
})
})
</script>
使用$.get()函数发起带参数的请求时,示例代码如下:
<script>
$(function () {
$('button').on('click', function () {
$.get('http://www.liulongbin.top:3006/api/getbooks', { id: 1 }, function (res) {
console.log(res);
})
})
})
</script>
jQuery中$.post()函数的功能弹一,专门用来发起post请求,从而向服务器提交数据。
$.post()函数的语法如下:
$.post(url,[data],[callback])
其中,三个参数各自代表的含义如下:
使用$post()向服务器提交数据的示例代码如下:
<script>
$(function () {
$('button').on('click', function () {
$.get('http://www.liulongbin.top:3006/api/getbooks', { bookname: '水浒传', author: '施耐庵', publisher: '天津图书出版社' }, function (res) {
console.log(res);
})
})
})
</script>
相比于 . g e t ( ) 和 .get()和 .get()和.post()函数,jQuery中提供的$.ajax()函数,是一个功能比较综合的函数,它允许我们对Ajax请求进行更详细的配置。
$.ajax()函数的基本语法如下:
$.ajax({
type:' ',/请求的方式,例如GET或PosT
ur1:' ',//请求的URL地址
data:{},//这次请求要携带的数据
success:function(res){ }//请求成功之后的回调函数
})
使用$.ajax()发起GET请求时,只需要将type属性的值设置为‘GET ‘即可:
<script>
$(function () {
$('#btnGET').on('click', function () {
$.ajax({
type: 'GET',
url: 'http://www.liulongbin.top:3006/api/getbooks',
data: {
id: 1
},
success: function (res) {
console.log(res);
}
})
})
})
</script>
使用$.ajax()发起POST请求时,只需要将type属性的值设置为‘POST ‘即可:
<script>
$(function () {
$('#btnGET').on('click', function () {
$.ajax({
type: 'POST',
url: 'http://www.liulongbin.top:3006/api/getbooks',
data: {
bookname:'史记',
author:'司马迁',
publisher:'上海图书出版社'
},
success: function (res) {
console.log(res);
}
})
})
})
</script>
使用Ajax请求数据时,被请求的URL地址,就叫做数据接口(简称接口)。同时,每个接口必须有请求方式。
例如:
1.什么是接口测试工具
为了验证接口能香被正常被访问,我们常常需要使用接口测试工具,来对数据接口进行检测。
好处:接口测试工具能让我们在不写任何代码的情况下,对接口进行调用和测试。
2.下载并安装PostMan
访问PostMan的官方下载网址htps:www.getpostman.com/downloads/,下载所需的安装程序后,直接安装即可。
3、了解PostMan界面的组成部分
4、使用PostMan测试GET接口
、使用PostMan测试POST接口
1.什么是接口文档
接口文档,顾名思义就是接口的说明文档,它是我们调用接口的依据。好的接口文档包含了对接口URL,参数以及输出内容的说明,我们参照接口文档就能方便的知道接口的作用,以及接口如何进行调用。
接口文档可以包含很多信息,也可以按需进行精简,不过,一个合格的接口文档,应该包含以下6项内容,从而为接口的调用提供依据:
三 、什么是表单
表单在网页中主要负责数据采集功能。HTML中的标签,就是用于采集用户输入的信息,并通过标签的提交操作,把采集到的信息提交到服务器端进行处理。
标签用来采集数据,标签的属性则是用来规定如何把采集到的数据发送到服务器。
注意:当提交表单后,页面会立即跳转到action属性指定的URL地址
target属性用来规定在何处打开action URL。
它的可选值有5个,默认情况下,target的值是_self,表示在相同的框架中打开action URL。
method属性用来规定以何种方式把表单数据提交到action URL。它的可选值有两个,分别是get和post。默认情况下,method的值为get,表示通过URL地址的形式,把表单数据提交到action URL。
注意:
enctype属性用来规定在发送表单数据之前如何对数据进行编码。
它的可选值有三个,默认情况下,enctype的值为application/,x-www-form-urlencoded,表示在发送前编码所有的字符。
注意:
通过点击submit按钮,触发表单提交的操作,从而使页面跳转到action URL的行为,叫做表单的同步提交。
如果使用表单提交数据,则会导致以下两个问题:
解决方案:表单只负责采集数据,Ajax负责将数据提交到服务器。
在jQuery中,可以使用如下两种方式,监听到表单的提交事件:
<script>
$(function () {
$('form').on('submit', function () {
alert('监听表单提交事件1');
})
$('form').submit( function () {
alert('监听表单提交事件2');
})
})
</script>
当监听到表单的提交事件以后,可以调用事件对象的event.preventDefault()函数,来阻止表单的提交和页面的跳转,示例代码如下:
1、serialize()函数
为了简化表单中数据的获取操作,jQuery提供了serialize0函数,其语法格式如下:
$(selector).serialize()
serialize()函数的好处:可以一次性获取到表单中的所有的数据。
2、serialize()函数示例
注意:在使用serialize()函数快速获取表单数据时,必须为每个表单元素添加name属性!
var rows = [];
$.each(res.data, function (i, res) {
rows.push(' 评论人:' + res.username + '评论时间:' + res.time + '' + res.content + ' ')
})
$('#cmt-list').empty().append(rows.join('')); // 渲染列表ui结构
上述代码是通过字符串拼接的形式,来渲染U结构。
如果U结构比较复杂,则拼接字符串的时候需要格外注意引号之前的嵌套。且一具需求发生变化,修改起来也非常麻烦。
模板引擎,顾名思义,它可以根据程序员指定的模板结构和数据,自动生成一个完整的HTML页面。
**art-template是一个简约、超快的模板引擎。中文官网首页为http://aui.github.io/art-template/zh-cn/index.html
在浏览器中访问http://aui.github.io/art-template/zh-cn/docs/installation.html页面,找到下载链接后,鼠标右键,
选择““链接另存为”,将art-template下载到本地,然后,通过/
art-template提供了{{ }}这种语法格式,在{{ }}内可以进行变量输出,或循环数组等操作,这种{{ }}语法在art-template中被称为标准语法。
在{{ }}语法中,可以进行变量的输出、对像属性的输出、三元表达式输出、逻辑或输出、加减乘除等表达式输出。
如果要输出的value值中,包含了HTML标签结构,则需要使用原文输出语法,才能保证HTML标签被正常渲染。
如果要实现条件输出,则可以在{{ }}中使用if…else if…/if的方式,进行按需输出。
如果要实现循环输出,则可以在{{ }}内,通过each语法循环数组,当前循环的索引使用$index进行访问,当前的循环项使用$value进行访问。
<h3>{{regTime | dateFormat}}h3>
// 定义一个格式化时间的过滤器 dateFormat 如下:
template.defaults.imports.dateFormat = function (date) {
var date = new Date();
var y = date.getFullYear()
var m = date.getMonth() + 1
var d = date.getDate()
var hh = padZero(date.getHours());
var mm = padZero(date.getMinutes());
var ss = padZero(date.getSeconds());
return y + '-' + m + '-' + d + ' ' + hh + ':' + mm + ':' + ss;
}
1、基本语法
exec( )函数用于检索字符串中的正则表达式的匹配。
如果字符串中有匹配的值,则返回该匹配值,否则返回null。
正则表达式中()包起来的内容表示一个分组,可以通过分组来提取自己想要的内容,示例代码如下:
replace( )函数用于在字符串中用一些字符替换另一些字符,语法格式如下:
<script>
var result = '123456'.replace('123', 'abc'); console.log(result); //abc456
script>
<script>
var str = '我是{{name}}'
var pattern = /{{([a-zA-Z]+)}}/
var patternResult = pattern.exec(str)
// console.log(patternResult)
str = str.replace(patternResult[0], patternResult[1])
console.log(str)
script>
<script>
var str = '{{name}}今年{{ age }}岁了'
var pattern = /{{\s*([a-zA-Z]+)\s*}}/
var patternResult = null
while (patternResult = pattern.exec(str)) {
str = str.replace(patternResult[0], patternResult[1])
}
console.log(str)
script>
<script>
var str = '{{name}}今年{{ age }}岁了'
var pattern = /{{\s*([a-zA-Z]+)\s*}}/
var data = { name: '豆沙包', age: 18 };
var patternResult = null
while (patternResult = pattern.exec(str)) {
str = str.replace(patternResult[0], data[patternResult[1]])
}
console.log(str)//豆沙包今年18岁了
script>
XMLHttpRequest(简称xhr)是浏览器提供的Javascript对象,通过它,可以请求服务器上的数据资源。之前所学的jQuery中的Ajax函数,就是基于xhr对象封装出来的。
步骤:
<script>
//1.创建XHR 对象
var xhr = new XMLHttpRequest();
//2.调用open
xhr.open('GET', 'http://www.liulongbin.top:3006/api/getbooks');
//3. 调用send函数
xhr.send()
//4. 监听
xhr.onreadystatechange = function () {
if (xhr.readyState === 4 && xhr.status === 200) {
//获取服务器响应的数据
console.log(xhr.responseText);
}
}
script>
XMLHttpRequest对象的readyState属性,用来表示当前Ajax请求所处的状态。每个Ajax请求必然处于以
下状态中的一个:
使用xhr对象发起带参数的GET请求时,只需在调用xhr.open期间,为URL地址指定参数即可:
这种在URL地址后面拼接的参数,叫做查询字符串。
定义:查询字符串(URL参数)是指在URL的末尾加上用于向服务器发送信息的字符串(变量)。
格式:将英文的?放在URL的末尾,然后再加上参数=值,想加上多个参数的话,使用&符号进行分隔。以这个形式,可以将想要发送给服务器的数据添加到URL中。
无论使用 . a j a x ( ) , 还 是 使 用 .ajax(),还是使用 .ajax(),还是使用.get(),又或者直接使用xhr对象发起GET请求,当需要携带参数的时候,本质上,都是直接将参数以查询字符串的形式,追加到URL地址的后面,发送到服务器的。
1.什么是URL编码
URL地址中,只允许出现英文相关的字母、标点符号、数字,因此,在URL地址中不允许出现中文字符。
如果URL中需要包含中文这样的字符,则必须对中文字符进行编码(转义)。
URL编码的原则:使用安全的字符(没有特殊用途或者特殊意义的可打印字符)去表示那些不安全的字符。
浏览器提供了URL编码与解码的API,分别是:
<script>
console.log(encodeURI('豆沙包')); //%E8%B1%86%E6%B2%99%E5%8C%8
console.log(decodeURI('%E8%B1%86%E6%B2%99%E5%8C%8'))//豆沙包
console.log(decodeURI('%E8%B1%86'));//豆 每三个为一个字
console.log(decodeURI('%E6%B2%99'))//沙
console.log(decodeURI('%E5%8C%85'))//包
script>
URL编码的注意事项
由于浏览器会自动对URL地进行编码操作,因此,大多数情况下,程序员不需要关心URL地址的编码
与解码操作。
步骤:
<script>
// 1. 创建 xhr 对象
var xhr = new XMLHttpRequest()
// 2. 调用 open 函数
xhr.open('POST', 'http://www.liulongbin.top:3006/api/addbook')
// 3. 设置 Content-Type 属性
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')
// 4. 调用 send 函数
xhr.send('bookname=水浒传&author=施耐庵&publisher=上海图书出版社')
// 5. 监听事件
xhr.onreadystatechange = function () {
if (xhr.readyState === 4 && xhr.status === 200) {
console.log(xhr.responseText)
}
}
script>
数据交换格式,就是服务器端与客户端之间进行数据传输与交换的格式。
前端领域,经常提及的两种数据交换格式分别是XML和JSON。其中XML用的非常少,所以,我们重点要学习的数据交换格式就是JSON。
XML的英文全称是EXtensible Markup Language,即可扩展标记语言。因此,XML和HTML类似,
也是一种标记语言。
XML和HTML虽然都是标记语言,但是,它们两者之间没有任何的关系。
HTML被设计用来描述网页上的内容,是网页内容的载体
XML被设计用来传输和存储数据,是数据的载体
概念:JSON的英文全称是JavaScript Object Notation,即“JavaScript对象表法”。简单来讲,
JSON就是Javascript对象和数组的字符串表示法,它使用文本表示一个JS对象或数组的信息,因此,JSON的本质是字符串。
作用:JSON是一种轻量级的文本数据交换格式,在作用上类似于ML,专门用于存储和传输数据,但是JSON比XML更小、更快、更易解析。
现状:JSON是在2001年开始被推广和使用的数据格式,到现今为止,JSON已经成为了主流的数据交
换格式。
JSON就是用字符串来表示Javascript的对象和数组。所以,JSON中包含对象和数组两种结构,通过这两种结构的相互嵌套,可以表示各种复杂的数据结构。
对象结构:对象结构在JSON中表示为{ }括起来的内容。数据结构为{key:value,key:value,.}的键值对结构。其中,key必须是使用英文的双引号包裹的字符串,value的数据类型可以是数字、字符串、布尔值、nul、数组、对象6种类型。
数组结构:数组结构在JSON中表示为[ ]括起来的内容。数据结构为【java“,‘javascript“,30,true】。数组中数据的类型可以是数字、字符串、布尔值、null、数组、对象6种类型。
属性名必须使用双引号包裹
字符串类型的值必须使用双引号包裹
JSON中不允许使用单引号表示字符串
JSON中不能写注释
JSON的最外层必须是对象或数组格式
不能使用undefined或函数作为JSON的值
JSON的作用:在计算机与网络之间存储和传输数据。
JSON的本质:用字符串来表示Javascript对象数据或数组数据
JSON是JS对像的字符串表示法,它使用文本表示一个JS对像的信息,本质是一个字符串。例如:
要实现从JSON字符串转换为JS对象,使用JSON.parse( )方法:
<script>
var jsonStr = '{"a": "Hello", "b": "world"}'
var obj = JSON.parse(jsonStr)
console.log(obj)
script>
要实现从JS对像转换为SON字符串,使用SON.stringify( )方法:
<script>
var obj2 = { a: 'hello', b: 'world', c: false }
var str = JSON.stringify(obj2)
console.log(str)
console.log(typeof str)
script>
把数据对象转换为字符串的过程,叫做序列化,例如:调用SON.stringify(0函数的操作,叫做JSON序列化。
把字符串转换为数据对像的过程,叫做反序列化,例如:调用SON.parse0函数的操作,叫做SON反序列化。
itheima ()函数是我们自定义的Ajax函数,它接收一个配置对像作为参数,配置对像中可以配置如下属性:
需要把data对像,转化成查询字符串的格式,从而提交给服务器,因此提前定义resolveData函数如下:
不同的请求类型,对应xhr对象的不同操作,因此需要对请求类型进行if…else…的判断:
function resolveData(data) {
var arr = []
for (var k in data) {
var str = k + '=' + data[k]
arr.push(str)
}
return arr.join('&')
}
var res = resolveData({ name: 'zs', age: 20 })
console.log(res) //name=zs&age=20
function itheima(options) {
var xhr = new XMLHttpRequest()
// 把外界传递过来的参数对象,转换为 查询字符串
var qs = resolveData(options.data)
if (options.method.toUpperCase() === 'GET') {
// 发起GET请求
xhr.open(options.method, options.url + '?' + qs)
xhr.send()
} else if (options.method.toUpperCase() === 'POST') {
// 发起POST请求
xhr.open(options.method, options.url)
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')
xhr.send(qs)
}
xhr.onreadystatechange = function () {
if (xhr.readyState === 4 && xhr.status === 200) {
var result = JSON.parse(xhr.responseText)
options.success(result)
}
}
}
1.旧版XMLHttpRequest的缺点
有时,AJAX操作很耗时,而且无法预知要花多少时间。如果网速很慢,用户可能要等很久。新版本的XMLHttpRequest对像,增加了timeout属性,可以设置HTTP请求的时限:
xhr.timeout =3000
上面的语句,将最长等待时间设为3000毫秒。过了这个时限,就自动停止HTTP情求。与之配套的还有一个timeout事件,用来指定回调函数:
xhr.ontimeout function(event){
alert(‘请求超时!)
}
Ajax操作往往用来提交表单数据。为了方便表单处理,HTML5新增了一个FormData对象,可以模拟表单操作:
<script>
// 1. 创建 FormData 实例
var fd = new FormData()
// 2. 调用 append 函数,向 fd 中追加数据
fd.append('uname', 'zs')
fd.append('upwd', '123456')
var xhr = new XMLHttpRequest()
xhr.open('POST', 'http://www.liulongbin.top:3006/api/formdata')
xhr.send(fd)
xhr.onreadystatechange = function () {
if (xhr.readyState === 4 && xhr.status === 200) {
console.log(JSON.parse(xhr.responseText))
}
}
</script>
FormData对象也可以用来获取网页表单的值,示例代码如下:
<script>
// 1. 通过 DOM 操作,获取到 form 表单元素
var form = document.querySelector('#form1')
form.addEventListener('submit', function (e) {
// 阻止表单的默认提交行为
e.preventDefault()
// 创建 FormData,快速获取到 form 表单中的数据
var fd = new FormData(form)
var xhr = new XMLHttpRequest()
xhr.open('POST', 'http://www.liulongbin.top:3006/api/formdata')
xhr.send(fd)
xhr.onreadystatechange = function () {
if (xhr.readyState === 4 && xhr.status === 200) {
console.log(JSON.parse(xhr.responseText)) //{uname: 'name', upwd: 'doushabao'}
}
}
})
</script>
<input type="file" id="file1">
<button id="btnUpload">上传文件button>
<br>
<img src="" alt="" id="img" style="width: 800px;">
<script>
//1.获取上传文件的按钮
var btnUpload = document.querySelector('#btnUpload');
//2、监听上传文件按钮的点击事件
btnUpload.addEventListener('click', function () {
var files = document.querySelector('#file1').files;
if (files.length <= 0) {
return alert('你还未选择文件,请重新选择文件');
}
var fd = new FormData();
fd.append('avatar', files[0]);
var xhr = new XMLHttpRequest();
xhr.open('POST', 'http://www.liulongbin.top:3006/api/upload/avatar');
xhr.send(fd); //将fd 上传
xhr.onreadystatechange = function () {
if (xhr.readyState === 4 && xhr.status === 200) {
var data = JSON.parse(xhr.responseText)
if (data.status === 200) {
//上传成功
document.querySelector('#img').src = 'http://www.liulongbin.top:3006' + data.url;
} else {
//图片上传失败
console.log('图片上传失败' + data.message);
}
}
}
})
script>
1、ajaxStart(callback)
Ajax请求开始时,执行ajaxStart函数。可以在ajaxStart的callback中显示loading效果,示例代码如下:
注意:$(document).ajaxStart( )函数会监听当前文档内所有的Ajax请求。
2、ajaxStop(callback)
Ajax请求结束时,执行ajaxStop函数。可以在ajaxStop的callback中隐藏loading效果,示例代码如下:
axios也提供了类似干jQuery中$.ajax( )的函数,语法如下:
如果两个页面的协议,域名和端口都相同,则两个页面具有相同的源。
例如,下表给出了相对于http/www.test.com/index.html页面的同源检测:
同源策略(英文全称Same origin policy)是浏览器提供的一个安全功能。
MDN官方给定的概念:同源策略部限制了从同一个源加载的文档或脚本如何与来自另一个源的资源进行交互。这是一个用于隔离潜在恶意文件的重要安全机制。
通俗的理解:浏览器规定,A网站的vaScript,不允许和非同源的网站C之间,进行资源的交互,例如:
同源指的是两个URL的协议、域名、端口一致,反之,则是跨域。
出现跨域的根本原因:浏览器的同源策略不允许非同源的UL之间进行资源的交互。
网页:http:/www.test.com/index.html
接口:http:/www.api.com/userlist
现如今,实现跨域数据请求,最主要的两种解决方案,分别是JSONP和CORS。
JSONP:出现的早,兼容性好(兼容低版本)。是前端程序员为了解决跨域问题,被迫想出来的一种临时解决方案。缺点是只支持GET请求,不支持POST请求。
CORS:出现的较晚,它是W3C标准,属于跨域Ajax请求的根本解决方案。支持GET和POST请求。缺点是不兼容某些低版本的浏览器。
JSONP(JSON with Padding)是JSON的一种“使用模式”,可用于解决主流浏览器的跨域数据访问的问题。
由于浏览器同源策略的限制,网页中无法通过Ajax请求非同源的接口数据。但是源策略的影响,可以通过src属性,请求非同源的js脚本。
因此,JSONP的实现原理,就是通过script:标签的src属性,请求跨域的数据接口,并通过函数调用的形式,接收跨域接口响应回来的数据。