AJAX 全称为 Asynchronous JavaScript And XML,就是异步的 JS 和 XML。
通过 AJAX 可以在浏览器中向服务器发送异步请求,最大的优势:无刷新获取数据。
AJAX 不是新的编程语言,而是一种将现有的标准组合在一起使用的新方式。
XML 可扩展标记语言。
XML 被设计用来传输和存储数据。
XML 和 HTML 类似,不同的是 HTML 中都是预定义标签,而 XML 中没有预定义标签,
比如说我有一个学生数据: name = "孙悟空" ; age = 18 ; gender = "男" ; 用 XML 表示: <student> <name>孙悟空name> <age>18age> <gender>男gender> student>
没有浏览历史,不能回退
存在跨域问题(同源)
SEO 不友好
搜索栏,(搜索栏输入一个值,在下面出现一系列值)
注册页面,
淘宝页面(用户点击,向服务器发请求,返回请求,出现效果)等网页
XMLHttpRequest(XHR)对象
axios
Fetch技术
JSONP
1.HTTP协议,以及如何在游览器中怎么查看里面的一些属性
用户事件
SEO
4.关于POST和GET的区别(POST方式的请求体可以为空,GET方式的请求体为空)
5.关于怎么解决跨域的问题
有5个值,用于表示当前处在请求、响应过程的那个阶段
0 | 未初始化。尚未调用open()方法 |
---|---|
1 | 已打开(Open) 已调用open()方法,尚未调用send()fangfa |
2 | 已发送(Sent)。已调用send()方法,尚未收到响应 |
3 | 接收中(Receiving).已经收到部分响应 |
4 | 完成(Complete)已经收到所有的响应,可以使用 |
1xx:指示信息--表示请求已接收,继续处理
2xx:成功--表示请求已被成功接收、理解、接受
3xx:重定向--信息不完整需要进一步补充
4xx:客户端错误--请求有语法错误或请求无法实现
5xx:服务器端错误--服务器未能实现合法的请求
200 交易成功
400 错误请求,如语法错误
403 禁止访问
404 没有发现文件、查询或URL
500 内部服务器错误
详情了解可参考状态响应码
const express = require('express'); const app = express(); app.get('/server', (request, response) => { //设置响应头 设置允许跨域 response.setHeader('Access-Control-Allow-Origin', '*'); //设置响应体 response.send('HELLO AJAX - 2'); }); //4. 监听端口启动服务 app.listen(8000, () => { console.log("服务已经启动, 8000 端口监听中...."); }) 开启8000端口的服务器,用与客户端向其发送请求
<style> #result{ width:200px; height:100px; border:solid 1px #90b; } </style> <button>点击发送请求</button> <div id="result"></div>
<script>
//获取button元素
const btn = document.getElementsByTagName('button')[0];
const result = document.getElementById("result");
//绑定事件
btn.onclick = function(){
//1. 创建对象
const xhr = new XMLHttpRequest();
//2. 初始化 设置请求方法和 url
xhr.open('GET', 'http://127.0.0.1:8000/server?a=100&b=200&c=300');
//3. 发送
xhr.send();
//4. 事件绑定 处理服务端返回的结果
// on when 当....时候
// readystate 是 xhr 对象中的属性, 表示状态 0 1 2 3 4
// change 改变
xhr.onreadystatechange = function(){
//判断 (服务端返回了所有的结果)
if(xhr.readyState === 4){
//判断响应状态码 200 404 403 401 500
// 2xx 成功
if(xhr.status >= 200 && xhr.status < 300){
//处理结果 行 头 空行 体
//响应
// console.log(xhr.status);//状态码
// console.log(xhr.statusText);//状态字符串
// console.log(xhr.getAllResponseHeaders());//所有响应头
// console.log(xhr.response);//响应体
//设置 result 的文本
result.innerHTML = xhr.response;
}else{
console.log("it was error")
}
当点击按钮时(先开启服务器代码,进入到服务器代码的目录中使用 node -xxx.js)
与前面代码相似:
xhr.open('POST', 'http://127.0.0.1:8000/server'); //设置请求头 xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded'); xhr.setRequestHeader('name','atguigu'); //3. 发送 xhr.send('a=100&b=200&c=300');
POST方式可携带参数,server.js中修改
response.send('HELLO AJAX POST')
const data = { name: 'atguigu' }; //对对象进行字符串转换 let str = JSON.stringify(data); //设置响应体 response.send(str);
1. 手动对数据转化 let data = JSON.parse(xhr.response) console.log(data); result.innerHTML = data.name; 2. 自动转换 //设置响应体数据的类型 xhr.responseType = 'json';(在xhr.onreadystatechange之前) console.log(xhr.response); result.innerHTML = xhr.response.name;
IE缓存问题:就是在客户端向服务器发送请求,第一次请求正常,第二次
显示的结果为第一次的结果。这是因为IE走的是缓存。
解决方法:
可在请求的url后面添加Date.now()(时间戳)
eg: xhr.open("GET",'http://127.0.0.1:8000/ie?t='+Date.now());
setTimeout(() => { //设置响应体 response.send('延时响应'); }, 3000) 服务器端修改
客户端修改
//超时设置 2s 设置 xhr.timeout = 2000; //超时回调 xhr.ontimeout = function(){ alert("网络异常, 请稍后重试!!"); } /网络异常回调 xhr.onerror = function(){ alert("你的网络似乎出了一些问题!"); }
此时弹出弹框显示-------"网络异常, 请稍后重试!!
当你设置网络为断网时弹框显示--------“你的网络似乎出了一些问题!”
在network中下的Oline选项选择offline(设置断网)
jQuery有多种实现AJAX的属性
具体可参考jQuery官网jQuery
服务器端代码(修改)前面的内容还是要的
const data = {name:'尚硅谷'}; response.send(JSON.stringify(data))
客户端代码
$.get('http://127.0.0.1:8000/jquery-server', {a:100, b:200}, function(data){ console.log(data); },'json'); 数据输出形式为json形式
$.post('http://127.0.0.1:8000/jquery-server', {a:100, b:200}, function(data){ console.log(data); });
$.ajax({ //url url: 'http://127.0.0.1:8000/jquery-server', //参数 data: {a:100, b:200}, //请求类型 type: 'GET', //响应体结果 dataType: 'json', //成功的回调 success: function(data){ console.log(data); }, //超时时间 timeout: 2000, //失败的回调 error: function(){ console.log('出错啦!!'); }, //头信息 headers: { c:300, d:400 } });
因为在服务器设置了response.send('延时响应'); }, 3000)
而在通用方法中timeout: 2000,
axios
$ npm install axios
需要注意的是axios方式得到的数据是Promise对象
可以设置
axios.defaults.baseURL = ‘http://127.0.0.1:8000’;
下面就不必写那么长的url
axios.get('/axios-server', { //url 参数 params: { id: 100, vip: 7 }, //请求头信息 headers: { name: 'atguigu', age: 20 } }).then(value => { console.log(value); }); }
axios.post('/axios-server', { username: 'admin', password: 'admin' }, { //url params: { id: 200, vip: 9 }, //请求头参数 headers: { height: 180, weight: 180, } });
axios({ //请求方法 method : 'POST', //url url: '/axios-server', //url参数 params: { vip:10, level:30 }, //头信息 headers: { a:100, b:200 }, //请求体参数 data: { username: 'admin', password: 'admin' } }).then(response=>{ //响应状态码 console.log(response.status); //响应状态字符串 console.log(response.statusText); //响应头信息 console.log(response.headers); //响应体 console.log(response.data); })
fetch('http://127.0.0.1:8000/fetch-server?vip=10', { //请求方法 method: 'POST', //请求头 headers: { name:'atguigu' }, //请求体 body: 'username=admin&password=admin' }).then(response => { // return response.text(); return response.json(); }).then(response=>{ console.log(response); });
通过fetch方式得到的数据也是Promise对象
同源策略(Same-Origin Policy)最早由 Netscape 公司提出,是浏览器的一种安全策略
同源: 协议、域名、端口号 必须完全相同。
违背同源策略就是跨域。
此时server.js改变
const express = require('express'); const app = express(); app.get('/home', (request, response)=>{ //响应一个页面 response.sendFile(__dirname + '/index.html'); }); app.get('/data', (request, response)=>{ response.send('用户数据'); }); app.listen(9000, ()=>{ console.log("服务已经启动..."); });
//1.动态的创建一个 script 标签 var script = document.createElement("script"); //2.设置 script 的 src,设置回调函数 script.src = "http://localhost:3000/testAJAX?callback=abc"; function abc(data) { alert(data.name); }; //3.将 script 添加到 body 中 document.body.appendChild(script); //4.服务器中路由的处理 router.get("/testAJAX" , function (req , res) { console.log("收到请求"); var callback = req.query.callback; var obj = { name:"孙悟空", age:18 } res.send(callback+"("+JSON.stringify(obj)+")"); });
CROS
//主要是服务器端的设置: router.get("/testAJAX" , function (req , res) { //通过 res 来设置响应头,来允许跨域请求 //res.set("Access-Control-Allow-Origin","http://127.0.0.1:3000"); res.set("Access-Control-Allow-Origin","*"); res.send("testAJAX 返回的响应"); });