Ajax基础(中)
这节主要在上节的基础上学会如何使用Ajax
源码下载:
链接:https://pan.baidu.com/s/1kG-vACFxneAZqONdo97XrQ
提取码:k21y
在WebStorm中打开整个工程,首先需要关注的是bin、routes、views文件夹下的内容。

在上一节介绍过如何启动web服务器,这里再介绍一种服务器的方法:选中AjaxServer-->bin-->www(服务器完成后这部分代码会自动生成),
右击,选择Run 'www',同样也可以启动服务器,这样输入网址就可以访问服务器资源了。

为什么输入localhost:3000就会返回一个页面呢?
构建服务器的时候,会生成一个routes和views文件夹,在输入网址的时候,首先会访问这两文件夹里面的内容。
routes--->index.js index title就是index.ejs中的title,如果Express修改为其他的,返回的页面内容也会有相应的变化
var express = require('express'); var router = express.Router(); /* GET home page. 页面路由*/ router.get('/', function(req, res, next) { res.render('index', { title: 'Express' }); }); module.exports = router;
views-->index.ejs
<!DOCTYPE html> <html> <head> <title><%= title %></title> <link rel='stylesheet' href='/stylesheets/style.css' /> </head> <body> <h1><%= title %></h1> <p>Welcome to <%= title %></p> </body> </html>
我把Express--->Ajax学习大本营,返回的页面也变化了

上面能够返回页面的叫做页面路由,那么怎么返回数据呢?返回数据的叫做接口路由,这里接口路由返回一json数据。
var express = require('express'); var router = express.Router(); /* GET home page. 页面路由:是返回页面的*/ router.get('/', function(req, res, next) { res.render('index', { title: 'Ajax学习大本营' }); }); /*接口路由:返回数据*/ router.get('/api/one',function (req,res,next){ res.json({ "state":200, data:{ "name":"zxtang", "age":20 } }); }); module.exports = router;

同样的,使用Postman来测试

接下来修改一下页面路由,页面上是一个button
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> </head> <body> <button id="send">发起get请求</button> <script> window.addEventListener('load',function (){ var btn=document.getElementById('send'); btn.addEventListener('click',function (){ alert('点击我') }) }); </script> </body> </html>

如何使用Ajax?
在前面的基础上,我们已经知道了Ajax的一些基础,客户端发送请求是通过js来发送的,为了在客户端和服务器之间交换一些数据,我们需要在js中创建一个对象,这就要创建XMLHttpRequest对象。
所有现代浏览器均支持 XMLHttpRequest 对象,XMLHttpRequest 用于在客户端与服务器交换数据,通过该对象可以在不重新加载整个网页的情况下,对网页的某部分进行更新,使用的步骤如下:
1)创建XMLHttpRequest对象
var xhr = new XMLHttpRequest();
2)准备发送
xhr.open('get', './01check.js?username='+uname+'&password='+pw,true);

3)执行发送动作
xhr.send()
xhr.seng(String)主要用于POST方法
![]()
4)指定回调函数
onreadystatechange 事件:当请求被发送到服务器时,我们需要执行一些基于响应的任务,每当 readyState 改变时,就会触发 onreadystatechange 事件

案例1:通过XMLHttpRequest来发起请求
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<button id="send">发起get请求</button>
<script>
window.addEventListener('load',function (){
var btn=document.getElementById('send');
btn.addEventListener('click',function (){
//1.创建一个XMLHttpRequest对象
var xhr = new XMLHttpRequest();
//2.准备发送
xhr.open('get','http://localhost:3000/api/one',true);
//3.发送请求
xhr.send();
//4.监听服务器的响应
xhr.addEventListener('readystatechange',function (){
//响应完成,但不一定正确
if(xhr.readyState===4){
console.log("响应完成");
}
if(xhr.status===200) {
console.log("响应正确");
}
})
})
});
</script>
</body>
</html>

显示数据内容 console.log(xhr.response);
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<button id="send">发起get请求</button>
<script>
window.addEventListener('load',function (){
var btn=document.getElementById('send');
btn.addEventListener('click',function (){
//1.创建一个XMLHttpRequest对象
var xhr = new XMLHttpRequest();
//2.准备发送
xhr.open('get','http://localhost:3000/api/one',true);
//3.发送请求
xhr.send();
//4.监听服务器的响应
xhr.addEventListener('readystatechange',function (){
//响应完成,但不一定正确
if(xhr.readyState===4){
console.log("响应完成");
}
if(xhr.status===200) {
console.log("响应正确");
//数据内容
console.log(xhr.response);
}
})
})
});
</script>
</body>
</html>

案例2:在客户端浏览器附加上输入账号和密码,然后通过按钮将账号和密码数据发送给服务器,服务器接收之后,将数据封装成一个json返回 给客户端。
参照:xhr.open('get', './01check.js?username='+uname+'&password='+pw,true);
www代码:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<label>
<input id="account" type="text" name="account"><input>
</label>
<label>
<input id="pwd" type="text" name="pwd"><input>
</label>
<button id="send">发起get请求</button>
<script>
window.addEventListener('load',function (){
var btn=document.getElementById('send');
btn.addEventListener('click',function (){
//1.创建一个XMLHttpRequest对象
var xhr = new XMLHttpRequest();
var account=document.getElementById('account').value;
var pwd=document.getElementById('pwd').value;
xhr.open('get','http://localhost:3000/api/two?account='+account+'&pwd='+pwd,true)
xhr.send();
xhr.addEventListener('readystatechange',function (){
if(xhr.readyState === 4 && xhr.status === 200){
console.log(xhr.responseText);
}
})
})
});
</script>
</body>
</html>
index.js代码:
var express = require('express'); var router = express.Router();/*接口路由:返回数据*/ router.get('/api/two',function (req,res,next){ console.log(req.query); //返回json数据 res.json({ "state":200, data: req.query }); }); module.exports = router;
req.query表示返回客户端发给服务器的数据,即拼接的account和pwd内容
index.ejs代码
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> </head> <body> <label> <input id="account" type="text" name="account"><input> </label> <label> <input id="pwd" type="text" name="pwd"><input> </label> <button id="send">发起get请求</button> <script> window.addEventListener('load',function (){ var btn=document.getElementById('send'); btn.addEventListener('click',function (){ //1.创建一个XMLHttpRequest对象 var xhr = new XMLHttpRequest(); var account=document.getElementById('account').value; var pwd=document.getElementById('pwd').value; xhr.open('get','http://localhost:3000/api/two?account='+account+'&pwd='+pwd,true) xhr.send(); xhr.addEventListener('readystatechange',function (){ if(xhr.readyState === 4 && xhr.status === 200){ console.log(xhr.responseText); } }) }) }); </script> </body> </html>

案例2:在客户端浏览器label表单输入账号和密码,然后通过按钮将账号和密码数据发送给服务器,服务器接收之后,将数据封装成一个json返回 给客户端。
index.js代码
var express = require('express'); var router = express.Router(); /* GET home page. 页面路由:是返回页面的*/ router.get('/', function(req, res, next) { res.render('index', { title: 'Ajax学习大本营' }); }); /*接口路由:返回数据*/ router.get('/api/two',function (req,res,next){ console.log(req.query); //返回一json数据给客户端,使用req.query可以获取浏览器中的拼接数据 res.json({ "state":200, data: req.query }); }); module.exports = router;
index.ejs代码
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> </head> <body> <label> <input id="account" type="text" name="account"> </label> <label><input id="pwd" type="text" name="pwd"> </label> <button id="send">发起get请求</button> <script> window.addEventListener('load',function (){ var btn=document.getElementById('send'); btn.addEventListener('click',function (){ //1.创建一个XMLHttpRequest对象 var xhr = new XMLHttpRequest(); var account=document.getElementById('account').value; var pwd=document.getElementById('pwd').value; xhr.open('get','http://localhost:3000/api/two?account='+account+'&pwd='+pwd,true) xhr.send(); xhr.addEventListener('readystatechange',function (){ if(xhr.readyState === 4 && xhr.status === 200){ console.log(xhr.responseText); } }) }) }); </script> </body> </html>
首先在浏览器中输入localhost:3000返回页面,然后在label中输入账户和密码,通过button发送账户和密码给服务器,服务器将数据返回给客户端。

304表示从缓存读取数据

GET请求方法封装
在public文件夹下新建一个js文件,再添加AjaxTool.js

(function (window){ function AjaxTool(){ } AjaxTool.ajaxRequest=function (url,paramObj,successCallback, failedCallback){ var xhr=new XMLHttpRequest(); xhr.open('get', url + '?' + getStrWithObject(paramObj), true); xhr.send(); xhr.addEventListener('readystatechange', function (ev2) { if(xhr.readyState === 4){ if(xhr.status === 200){ // 请求成功 successCallback && successCallback(xhr); }else { // 请求失败 failedCallback && failedCallback(xhr); } } }); }; /* { name: "张三", age: 18 } [‘name="张三"’, “age=18”, "random=323323232"] name="张三"&age=18 */ /** * 把对象转换成字符串 */ function getStrWithObject(paramObj) { var resArr=[]; //1.转换对象 for(var key in paramObj) { var str = key + '=' + paramObj[key]; resArr.push(str); } //2.拼接时间戳 resArr.push('random='+getRandomStr()); //3.数组转成字符串 return resArr.join('&'); } /** * 获取随机时间戳 * @returns {number} */ function getRandomStr() { return Math.random() + (new Date().getTime()); } window.AjaxTool = AjaxTool; })(window)
index.js添加以下:
router.get('/api/three', function(req, res, next) {
res.json({
"state": 200,
"data": req.query
});
});
index.ejs代码:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<label>
<input id="account" type="text" name="account">
</label>
<label><input id="pwd" type="text" name="pwd">
</label>
<button id="send">发起get请求</button>
<script src="/js/AjaxTool.js"></script>
<script>
window.addEventListener('load',function (){
var btn=document.getElementById('send');
btn.addEventListener('click',function (){
//1.创建一个XMLHttpRequest对象
var xhr = new XMLHttpRequest();
var account=document.getElementById('account').value;
var pwd=document.getElementById('pwd').value;
// 2. 参数对象
var paramsObj = {
"account": account,
"pwd": pwd
}
AjaxTool.ajaxRequest('http://localhost:3000/api/three', paramsObj, function (xhr) {
// 处理成功的回调
console.log('请求成功:', xhr.responseText);
}, function (xhr) {
// 处理失败的回调
console.log('请求失败');
})
})
});
</script>
</body>
</html>

那如果要测试请求失败,怎么?
AjaxToolOne.js
(function (window){ function AjaxTool(){ } AjaxTool.ajaxRequest=function (url,paramObj,timeOut,successCallback, failedCallback){ var xhr=new XMLHttpRequest(); xhr.open('get', url + '?' + getStrWithObject(paramObj), true); xhr.send(); xhr.addEventListener('readystatechange', function (ev2) { if(xhr.readyState === 4){ if(xhr.status === 200){ // 请求成功 successCallback && successCallback(xhr); clearTimeout(timer);//清除定时器 }else { // 请求失败 failedCallback && failedCallback(xhr); } } }); // timeOut0 代表不限制请求的时间 //如果时间超过timeOut,那么返回一个加载超时 var timer = null; if(timeOut > 0){ //创建定时器 timer = setTimeout(function () { // 取消请求 xhr.abort(); }, timeOut); } }; /* { name: "张三", age: 18 } [‘name="张三"’, “age=18”, "random=323323232"] name="张三"&age=18 */ /** * 把对象转换成字符串 */ function getStrWithObject(paramObj) { var resArr=[]; //1.转换对象 for(var key in paramObj) { var str = key + '=' + paramObj[key]; resArr.push(str); } //2.拼接时间戳 resArr.push('random='+getRandomStr()); //3.数组转成字符串 return resArr.join('&'); } /** * 获取随机时间戳 * @returns {number} */ function getRandomStr() { return Math.random() + (new Date().getTime()); } window.AjaxTool = AjaxTool; })(window)
index,.js
router.get('/api/four', function(req, res, next) {
//给服务器设置延时,测试请求延时
setTimeout(function () {
res.json({
"state": 200,
"data": "测试请求延时"
});
}, 2000);
});
index.ejs
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<label>
<input id="account" type="text" name="account">
</label>
<label><input id="pwd" type="text" name="pwd">
</label>
<button id="send">发起get请求</button>
<script src="/js/AjaxToolOne.js"></script>
<script>
window.addEventListener('load',function (){
var btn=document.getElementById('send');
btn.addEventListener('click',function (){
//1.创建一个XMLHttpRequest对象
var xhr = new XMLHttpRequest();
var account=document.getElementById('account').value;
var pwd=document.getElementById('pwd').value;
// 2. 参数对象
var paramsObj = {
"account": account,
"pwd": pwd
}
AjaxTool.ajaxRequest('http://localhost:3000/api/four', paramsObj,2000, function (xhr) {
// 处理成功的回调
console.log('请求成功:', xhr.responseText);
}, function (xhr) {
// 处理失败的回调
console.log('请求失败');
})
})
});
</script>
</body>
</html>


POST请求方法
index.js添加POST请求路由:
router.post('/api/five', function(req, res, next) {
console.log(req.body);
res.json({
"state": 200,
"data": "你发起的是一个post请求"
});
});
和GET请求不同,POST请求需要设置一个请求头,index.ejs:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title></title>
<style>
body {
background-color: skyblue;
}
</style>
</head>
<body>
<label>
<input id="account" type="text" name="account">
</label>
<label>
<input id="pwd" type="text" name="pwd">
</label>
<button id="send">发起Post请求</button>
<script>
window.addEventListener('load', function (ev) {
var btn = document.getElementById('send');
btn.addEventListener('click', function (ev1) {
// 1. 获取用户输入的内容
var account = document.getElementById('account').value;
var pwd = document.getElementById('pwd').value;
// 2. 创建网络请求对象
var xhr = new XMLHttpRequest();
xhr.open('post', 'http://localhost:3000/api/five', true);
// 设置请求头
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.send('name=zs&age=19');
xhr.addEventListener('readystatechange', function (ev2) {
if(xhr.readyState === 4 ){
if(xhr.status === 200){
console.log(xhr.responseText);
}else {
console.log('请求失败!');
}
}
});
});
});
</script>
</body>
</html>
req.body表示服务器接收到客户端发送过来的数据

浙公网安备 33010602011771号