一、网页中如何请求数据
我们从浏览器看到的视频、音乐都属于资源;当然数据也是服务器对外提供的一种资源,只要是数据,都要经过请求 — 处理 — 响应 的方式进行获取。
网页中请求服务端的数据需要用到XMLHttpRequest对象 ,简称xhr,是浏览器提供的JS成员
资源的请求方式
请求方式 | 说明 | 举例 |
---|
get | 获取服务器的资源 | 从腾讯上看综艺 | post | 向服务器提交资源 | 登录微信账号 |
二、Ajax
1、什么是Ajax
概念:Ajax(全称:Asynchronous JavaScript and XML)是一种用于创建快速动态网页的技术,在网页中利用XMLHttpRequest对象和服务器进行数据交互的方式 注意:Ajax不是一种技术规范,只是多种技术的组合。每种技术都有其独特这处,合并在一起形成了一个功能强大的新技术。
2、Ajax的特点
特点:局部刷新,异步加载 通过与后端服务器进行少量的数据交换,Ajax可以使页面实现异步更新。这也意味着可以在不重新加载整个页面的情况下,对页面某个部分进行局部更新。
3、Ajax工作原理
客户端发送请求,请求交给xhr,xhr把请求提交给服务器,服务器进行业务处理,服务器响应数据交给xhr对象,xhr对象接收数据,由javascript把数据写到页面上
4、同步与异步的区别
同步提交:当用户发送请求时,当前页面不能使用,服务器响应页面到客户端,响应完成之后用户采用使用页面。
异步提交:当用户发送请求时,当前页面可以使用,当异步请求的数据响应给页面,页面把数据显示出来。
三、jQuery中的Ajax
浏览器提供的xhr使用方法比较复杂,jQurey对其进行二次封装,降低使用难度(xhr详解:https://blog.csdn.net/Vest_er/article/details/127397828 ) jQuery中发起Ajax请求的方法
1、$.get()函数
向服务器请求数据 语法:
$.get(url, [data], [callback])
参数名 | 参数类型 | 必选? | 说明 |
---|
url | sting | 是 | 要请求的资源地址 | data | object | 否 | 请求资源要携带的参数 | callback | function | 否 | 请求成功的回调函数 |
2、$.post()函数
向服务器提交数据 语法(参数同$.get()函数)
$.post(url, [data], [callback])
3、$.ajax()函数
综合,可以请求也可以提交数据
语法
$.ajax({
tyep:'',
url:'',
data:{},
sunccess:function(res){}
})
四、模仿jQuery封装自己的Ajax函数
实现效果
<!-- 导入自定义的ajax函数库 -->
<script src="./MyAjax.js"></script>
<script>
myAjax({
methods:'请求类型',
url:'请求地址',
data:{请求参数对象},
success:function(res){
console.log(res);
}
})
</script>
1、定义options参数选项
myAjax()函数是我们自己定义的Ajax函数,它接收一个配置对象作为参数,配置对象中可以配置如下属性
属性名 | 功能 |
---|
method | 请求类型 | url | 请求的URL地址 | data | 请求携带的参数 | success | 请求成功之后的回调函数 |
2、定义resoveData()函数处理data参数
需要把data参数对象转化成查询字符串 的格式,从而提交到服务器,因此需要提前定义resoveData函数
function resoveData(data){
var arr = [];
for(var k in data){
arr.push(k + '=' + data[k]);
};
return arr.join('&');
}
3、定义myAjax()函数
在myAjax()函数中,需要创建xhr对象,并监听onreadyStatechange事件
function myAjax(options){
var xhr = new XMLHttpRequest();
var qs = resoveData(options.data);
xhr.onreadystatechange = function (){
if(xhr.readyState == 4 && xhr.status == 200) {
var result = JSON.parse(xhr.responseText);
options.success(result)
}
}
}
4、判断请求类型
toUpperCase()函数:转化为大写
if(options.methods.toUpperCase() === 'GET') {
xhr.open(options.methods,options.url + '?' + qs);
xhr.send();
}else if(options.methods.toUpperCase() === 'POST') {
xhr.open(options.methods,options.url);
xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
xhr.send(qs)
}
五、使用封装的Ajax函数发送请求
MyAjax.js代码
function resoveData(data){
var arr = [];
for(var k in data){
arr.push(k + '=' + data[k]);
};
return arr.join('&');
}
function myAjax(options){
var xhr = new XMLHttpRequest();
var qs = resoveData(options.data);
if(options.methods.toUpperCase() === 'GET') {
xhr.open(options.methods,options.url + '?' + qs);
xhr.send();
}else if(options.methods.toUpperCase() === 'POST') {
xhr.open(options.methods,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)
}
}
}
index.js代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script src="./MyAjax.js"></script>
<title>Document</title>
</head>
<body>
<script>
myAjax({
method:'GET',
url:'http://www.liulongbin.top:3006/api/getbooks',
data:{id:1},
success:function(res){
console.log(res);
}
});
myAjax({
method:'POST',
url:'http://www.liulongbin.top:3006/api/addbook',
data:{bookname:"憨瓜与波妞",author:"离奇6厘米",publisher:"郑州图书出版社"},
success:function(res){
console.log(res);
}
})
</script>
</body>
</html>
运行结果
|