AJAX的请求方式
AJAX
AJAX简介
AJAX全称为Asynchronous JavaScript And XML,就是异步的 JS 和 XML。
通过AJAX可以在浏览器中向服务器发送异步请求,最大的优势:无刷新获取数据。AJAX不是新的编程语言,而是一种将现有的标准组合在一起使用的新方式。
XML简介
XML可扩展标记语言。
XML被设计用来传输和存储数据。
XML和 HTML类似,不同的是HTML中都是预定义标签,而xML中没有预定义标签,全都是自定义标签,用来表示一些数据。
比如说我有一个学生数据:
name ="孙悟空"; age= 18 ; gender = "男";
用XML表示:
<student>
<name>孙悟空</name>
<age>18</age>
<gender>男</gender>
</student>
AJAX的特点
AJAX的优点
可以无需刷新页面而与服务器端进行通信。
允许你根据用户事件来更新部分页面内容。
AJAX的缺点
没有浏览历史,不能回退
存在跨域问题(同源)
SEO 不友好
AJAX的使用
HTTP
HTTP (hypertext transport protocol)协议『超文本传输协议』,协议详细规定了浏览器和万维网服务器之间互相通信的规则。
请求报文
重点是格式与参数
行 POST /s?ie=utf-8 HTTP/1.1
头 Host: atguigu.com
Cookie: name=guigu
Content-type: application/x-www-form-urlencoded
User-Agent: chrome 83
空行
体 username=admin&password=admin
响应报文
行 HTTP/1.1 280 oK
头 Content-Type: text/html; charset=utf-8
Content-length: 2048
Content-encoding: gzip
空行
体 <html>
<head></head>
body>
<h1>苏槿年</h1>
</body>
</html>
引入express
//1.引入express
const express = require( 'express' );
//2.创建应用对象
const app = express();
//3.创建路由规则
// request是对请求报文的封装
// response是对响应报文的封装
app.get( '/server ' , (request, response)=>{
//设置响应头设置允许跨域
response. setHeader( ' Access-Control-Allow-Origin', '*');
//设置响应体
response.send( 'HELLO AJAX');
});
//4.监听端口启动服务
app.listen( 8000,()=>{
console.log("服务已经启动,8000端口监听中....");
});
AJAX请求格式
GET请求
//绑定事件
btn.onclick = function(){
//1.创建对象
const xhr = new XMLHttpRequest();
//2.初始化设置请求方法和url
xhr.open( 'GET', 'http://127.0.0.1 :8000/server' );
//3.发送
xhr.send();
//4.事件绑定处理服务端返回的结果
// on when当....时候
// readystate 是 xhr对象中的属性,表示状态日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{
}
}
}
POST请求
//获取元素对象
const result = document.getElementById( "result");
//绑定事件
result.addEventListener( "mouseover", function(){
//1.创建对象
const xhr = new XMLHttpRequest();
//2.初始化设置类型与URL
xhr.open( 'POST', 'http://127.0.0.1:8000/server');
//设置请求头
xhr.setRequestHeader('Content-Type' , 'application/x-www-form-urlencoded')
xhr.setRequestHeader( ' name ' , 'sujinnian');
//3.发送
xhr.send('a=100&b=200&c=300');//请求体,请求数据,任意格式,任何形式
//xhr.send('a:100&b:200&c:300');
//xhr.send('123456');
//4.事件绑定
xhr.onreadystatechange = function(){
//判断
if(xhr.readyState == 4){
if(xhr.status >= 200 && xhr.status < 300){
//处理服务端返回的结果
result.innerHTML = xhr.response;
}
}
}
});
服务端响应JSON数据
//绑定事件
btn.onclick = function(){
//1.创建对象
const xhr = new XMLHttpRequest();
//2.初始化设置请求方法和url
xhr.open( 'GET', 'http://127.0.0.1 :8000/server' );
//3.发送
xhr.send();
//4.事件绑定处理服务端返回的结果
xhr.onreadystatechange = function(){
if(xhr.readyState === 4){
if(xhr.status >= 200 && xhr.status < 300){
//console.log(xhr.response);
//result.innerHTML = xhr.response;
//手动对数据转化
//let data = JSON.parse(xhr.response);
//console.log(data);
//result.innerHTML = data.name;
//自动转换
console.log(xhr.response);
result.innerHTML = xhr.response;
}
}
}
AJAX请求超时与网络错误
//绑定事件
btn.onclick = function(){
const xhr = new XMLHttpRequest();
//超时设置2s 设置
xhr.timeout = 2000;
//超时回调
xhr.ontimeout = function(){
alert("网络异常,请稍后重试!!");
}
//网路异常回调
xhr.onerror = function(){
alert("你的网络似乎出了一些问题!")
}
xhr.open('GET', 'http://127.0.0.1 :8000/server' );
//3.发送
xhr.send();
xhr.onreadystatechange = function(){
if(xhr.readyState === 4){
if(xhr.status >= 200 && xhr.status < 300){
result.innerHTML = xhr.response;
}
}
}
AJAX请求取消
//获取元素对象
const btns = document.querySelectorAl1 ( ' button ' );
let x = null;
btns[e].onclick = function(){
x = new XMLHttpRequest();
x.open( "GET", "http://127.0.0.1:8000/delay");
x.send();
}
// abort;请求取消
btns[1].onclick = function(){
x.abort();
}
AJAX请求重复发送问题
//获取元素对象
const btns = document.querySelectorAl1("button");
let x = null;
//标识变量
let issending = false;//是否正在发送AJAX请求
btns[e].onclick = function(){
//判断标识变量
if(isSending) x.abort();// 如果正在发送,则取消该请求,创建一个新的请求
x=new XMLHttpRequest();
//修改标识变量的值
isSending = true;
x.open("GET", 'http://127.0.0.1:8000/delay');
x.send();
x.onreadystatechange = function(){
if(x.readyState ===4){
//修改标识变量
isSending = false;
}
}
}
jQuery中的AJAX
<div class="container">
<h2 class="page-header">jQuery发送AJAX请求</h2>
<button class="btn btn-primary" >GET</button>
<button class="btn btn-danger " >POST</button>
<button class="btn btn-info">通用型方法ajax</button>
</div>
<script>
//$.get('url',{参数},方法,数据类型)
$('button').eq(0).click(function(){
$.get('http://127.0.0.1:8000/jquery-server' , {a:100, b:200},function(data){
console.log(data);
},'json');
})
$('button').eq(1).click(function(){
$.post('http://127.0.0.1:8000/jquery-server', {a:100, b:200},function(data){
console.log(data);
});
})
</script>
通用方法
$.ajax({
//url
url:'http://127.0.0.1:8080/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
}
})
Axios发送AJAX请求
const btns = document.querySelectorA11('button');
//配置baseURL
axios.defaults.baseURL = 'http://127.0.0.1:8080';
btns[0].onclick = function(){
//GET 请求
axios.get('/axios-server' , {
// url参数
params: {
id:100,
vip:7
},
//请求头信息
headers: {
name:'sujinnian',
age: 20
}
}).then(value => {
console.log(value);
})
}
fetch函数发送AJAX请求
const btn = document.querySelector('button');
btn.onclick = function(){
fetch('http://127.0.0.1:8000/fetch-server?vip=10', {
//请求方法
method: "POST',
//请求头
headers:{
name:'sujinnian'
},
//请求体
body:'username=admin&password=admin'
}).then(response => {
// return response.text();
return response.json();
}).then(response=>{
console.log(response);
});
}
跨域
同源策略
同源:协议、域名、端口号 必须完全相同。
违背同源策略就是跨域。
如何解决跨域
JSONP
- JSONP是什么
JSONP(JSON with Padding),是一个非官方的跨域解决方案,纯粹凭借程序员的聪明才智开发出来,只支持get请求。
- JSONP怎么工作的?
在网页有一些标签天生具有跨域能力,比如: img link iframe script。JSONP就是利用script标签的跨域能力来发送请求的。
- JSONP的使用
1.动态的创建一个script标签
var script = document.cteateElement("script");
2设置script的src,设置回调函数
script.src = "http://localhost:3000/testAlAX?callback=abg";
原生jsonp的实现
//获取input元素
const input = document.querySelector('input');
const p = document.querySelector('p');
//声明 handle 函数
function handle(data){
input.style.border = "solid 1px #f00";
//修改p标签的提示文本
p.innerHTML = data.msg;
}
//绑定事件
input.onblur = function(){
//获取用户的输入值
let username = this.value;
//向服务器端发送请求检测用户名是否存在
//1.创建script标签
const script = document.createElement('script');
//2.设置标签的src属性
script.src = 'http://127.0.0.1:8000/check-username';
//3.将script插入到文档中
document.body.appendChild(script);
}
jQuery发送jsonp请求
$('button').eq(0).click(function(){
$.getJsoN('http://127.0.0.1:8000/jquery-jsonp-server?callback=?', function(data){
$('#result').html(`
//data属性
`)
});
}
CORS
CORS是什么?
CORS(Cross-Origin Resource Sharing),跨域资源共享。CORS是官方的跨域解决方案,它的特点是不需要在客户端做任何特殊的操作,完全在服务器中进行处理,支持get和 post 请求。跨域资源共享标准新增了一组HTTP首部字段,允许服务器声明哪些源站通过浏览器有权限访问哪些资源
CORS 怎么工作的?
CORS是通过设置一个响应头来告诉浏览器,该请求允许跨域,浏览器收到该响应以后就会对响应放行。
CORS的使用
请求方式使用下列方法之一:
- GET
- HEAD
- POST
HTTP Headers 匹配下面的
- Accept
- Accept-Language
- Content-Language
- Last-Event-ID
- Content-Type, 但值是其中的一种:
- application/x-www-form-urlencoded
- multipart/form-data
- text/plain
HTTP请求:
POST /cors HTTP/1.1
Origin:http://api.bob.com
Host: api.bob.com
有效的服务器CORS响应:
Access-Control-Allow-Origin: http://api.bob.com
Access-Control-Allow-Credentials: true
Access-Control-Expose-Headers: FooBar
Content-Type: text/html; charset=utf-8
CORS字段介绍:
(1)Access-Control-Allow-Methods
该字段必需,它的值是逗号分隔的一个字符串,表明服务器支持的所有跨域请求的方法。注意,返回的是所有支持的方法,而不单是浏览器请求的那个方法。这是为了避免多次"预检"请求。
(2)Access-Control-Allow-Headers
如果浏览器请求包括Access-Control-Request-Headers字段,则Access-Control-Allow-Headers字段是必需的。它也是一个逗号分隔的字符串,表明服务器支持的所有头信息字段,不限于浏览器在"预检"中请求的字段。
(3)Access-Control-Allow-Credentials
该字段与简单请求时的含义相同。
(4)Access-Control-Max-Age
该字段可选,用来指定本次预检请求的有效期,单位为秒。上面结果中,有效期是20天(1728000秒),即允许缓存该条回应1728000秒(即20天),在此期间,不用发出另一条预检请求。