ajax:在网页不刷新的情况下向服务器发起http请求,得到http响应
AJAX简介
AJAX就是异步的 JS 和 XML
通过 AJAX可以在浏览器向服务器发送异步请求,最大优势就是:无刷新获取数据
使用场景:
1、二级菜单,鼠标滑过去,就会出现新的东西
2、页面下滑,滑动条改变位置,发起请求,获取到新的页面
3、用户名框,输入任意用户名,下面弹出用户名格式不对
XML 简介
XML 可扩展标记语言
XML 被设计用来传输和存储数据
XML 和 HTML 类似,不同的是HTML是预定义标签,XML是自定义标签,用来表示一些数据
XML: <name>孙悟空</name> <age>18</age>
AJAX 特点
AJAX 优点
1、可以无需刷新页面与服务器端进行通信
2、允许你根据用户事件来更新部分页面内容
鼠标事件、键盘事件、表单事件
AJAX 缺点
1、没有浏览历史,不能回退
2、存在跨域问题
3、SEO不友好(因为数据是发Ajax请求获取到的,爬虫爬不到,源代码里没有)
SEO:搜索引擎优化
HTTP
HTTP : 超文本传输协议,协议详细规定了浏览器和万维网服务器之间互相通信的规则
请求报文
重点是格式与参数
行 GET、POST(请求方法) /url部分(携带参数) HTTP/1.1(http版本)
头 Host:baidu.com
Cookie:name=baidu
Content-type:...
空行
体 (get可以为空)
响应报文
行 HTTP/1.1(http版本) 200(状态码) OK(响应状态字符串)
头 Content-Type:text/html;charset=utf-8
Content-length:2048 这三条都是对响应体内容做相关描述
Content-encoding:gzip
空行 必须有
体 <html> 主要返回结果
<head>
</head>
<body>
<h1></h1>
</body>
</html>
404 找不到
403 没有权限
401 未授权
500 内部错误
Node.js
一个应用程序,可以解析Js代码,通过代码对计算机资源做操作
Nodemon
当文件内容修改时,自动监听,重启应用
安装: npm install -g nodemon 启动: nodemon server.js
Express
基于 Node.js 平台,快速、开放、极简的 Web 开发框架
在vs code 终端中,npm init --yes 初始化
然后 npm i express
express基本使用
//1.引入express
const { response } = require('express');
const express = require('express');
//2.创建应用对象
const app = express();
//3.创建路由规则
// request 对请求报文的封装
// reponse 对响应报文的封装
app.get('/', (request, response) => {
// 设置响应
response.send('Hello AJAX')
});
// 4.监听端口启动服务
app.listen(8000, () => {
console.log("服务已启动,8000端口监听中");
})
服务端启动命令
在终端:node server.js (node + 文件名)
终端输出:服务已启动,8000端口监听中
AJAX 案例1 GET请求
前端
#app {
width: 200px;
height: 100px;
border: 1px solid blue;
}
</style>
</head>
<body>
<button>点击发送请求</button>
<div id="app"></div>
</body>
<script>
const btn = document.getElementsByTagName('button')
[0];
const app = document.getElementById('app');
btn.onclick = function () {
// 1. 创建对象
const xhr = new XMLHttpRequest();
// 2. 初始化 设置请求方法和 url 0
xhr.open('GET', 'http://127.0.0.1:8000/server'); 1
// 3. 发送
xhr.send(); 2
// 4. 事件绑定 处理服务端返回的结果
// on 当....时候
// readystate 是xhr 对象中的属性,表示0 1 2 3 4
xhr.onreadystatechange = function () {
// 判断(服务端返回了所有的结果)
if (xhr.readyState === 4) {
// 判断响应码状态 2xx成功
if (xhr.status >= 200 && xhr.status < 300) {
// 设置app的文本
app.innerHTML = xhr.response //点击发起请求后在div里显示响应头的结果
} else {
}
}
}
}
</script>
服务端
//1.引入express
const { response } = require('express');
const express = require('express');
//2.创建应用对象
const app = express();
//3.创建路由规则
// request 对请求报文的封装
// reponse 对响应报文的封装
app.get('/server', (request, response) => {
// 设置响应头,设置允许跨域
response.setHeader('Access-Control-Allow-Origin', '*');
//
response.send('Hello AJAX')
});
// 4.监听端口启动服务
app.listen(8000, () => {
console.log("服务已启动,8000端口监听中");
})
设置GET请求参数:
xhr.open('GET', 'http://127.0.0.1:8000/server')
xhr.open('GET', 'http://127.0.0.1:8000/server?a=100&b=200')
AJAX 案例2 POST请求
前端
<!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">
<title>Document</title>
<style>
#box {
width: 200px;
height: 100px;
border: 1px solid rebeccapurple;
}
</style>
</head>
<body>
<div id="box"></div>
<script>
// 获取元素对象
const box = document.getElementById("box");
// 绑定事件,用bom2新方法
box.addEventListener('mouseover', function () {
// 1. 创建对象
const xhr = new XMLHttpRequest();
// 2. 初始化 设置请求方法和 url 0
xhr.open('POST', 'http://127.0.0.1:8000/server?a=100&b=200'); 1
// 3. 发送
xhr.send(); 2
// 4. 事件绑定 处理服务端返回的结果
xhr.onreadystatechange = function () {
// 判断(服务端返回了所有的结果)
if (xhr.readyState === 4) {
// 判断响应码状态 2xx成功
if (xhr.status >= 200 && xhr.status < 300) {
// 设置app的文本
box.innerHTML = xhr.response
} else {
}
}
}
})
</script>
</body>
</html>
服务端
//1.引入express
const { response } = require('express');
const express = require('express');
//2.创建应用对象
const app = express();
//3.创建路由规则
// request 对请求报文的封装
// reponse 对响应报文的封装
app.post('/server', (request, response) => {
// 设置响应头,设置允许跨域
response.setHeader('Access-Control-Allow-Origin', '*');
//
response.send('Hello AJAX POST')
});
// 4.监听端口启动服务
app.listen(8000, () => {
console.log("服务已启动,8000端口监听中");
})
设置POST请求参数:
xhr.send();
xhr.send('a=100&b=200')
设置请求头
// 设置请求头。第一个参数是头的名字,第二个头的值
xhr.setRequestHeader('name','TYC')
一般会把身份校验信息放在请求头里,传到服务器,校验
AJAX 案例3 JSON数据的响应
前端
<!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">
<title>Document</title>
<style>
#box {
width: 200px;
height: 100px;
border: 1px solid rebeccapurple;
}
</style>
</head>
<body>
<div id="box"></div>
<script>
const box = document.getElementById('box');
// 绑定价盘按下事件
window.onkeydown = function () {
// 发送请求
const xhr = new XMLHttpRequest();
// 设置响应体数据的类型
xhr.responseType = 'json'
// 初始化
xhr.open('GET', 'http://127.0.0.1:8000/json-server');
// 发送
xhr.send();
// 事件绑定
xhr.onreadystatechange = function () {
if (xhr.readyState === 4) {
if (xhr.status >= 200 && xhr.status < 300) {
console.log(xhr.response);
// 手动转换
// let data = JSON.parse(xhr.response);
// box.innerHTML = data.name
// 自动转换
box.innerHTML = xhr.response.name
}
}
}
}
</script>
</body>
</html>
服务端
//1.引入express
const { response } = require('express');
const express = require('express');
//2.创建应用对象
const app = express();
//3.创建路由规则
// request 对请求报文的封装
// reponse 对响应报文的封装
app.all('/json-server', (request, response) => {
// 设置响应头,设置允许跨域
response.setHeader('Access-Control-Allow-Origin', '*');
response.setHeader('Access-Control-Allow-Headers', '*');
// 响应一个数据
const data = {
name: '张三'
};
// 对对象进行字符串转换
let str = JSON.stringify(data)
// 设置响应体
response.send(str)
});
// 4.监听端口启动服务
app.listen(8000, () => {
console.log("服务已启动,8000端口监听中");
})
AJAX 案例4 JSON数据的响应
xhr.open('GET', 'http://127.0.0.1:8000/json-server');
加一个时间戳
xhr.open('GET', 'http://127.0.0.1:8000/json-server'?t= Date.now());
请求取消
调用abort方法 xhr.abort()
Axios发送请求
axios.get(url,config)
axios.post(url,data,config)
通用方法
<body>
<button>GET</button>
<button>POST</button>
<button>AJAX</button>
<script crossorigin="anonymous" src="https://cdn.bootcdn.net/ajax/libs/axios/0.26.1/axios.js"></script>
<script>
const btns = document.querySelectorAll('button');
// 配置baseURL
axios.defaults.baseURL = 'http://127.0.0.1:8000'
btns[0].onclick = function () {
axios.get('/axios-server', {
// url参数
params: {
id: 100,
vip: 8
},
// 请求头信息
headers: {
name: "babbala",
age: 20
}
}).then(value => {
console.log(value);
})
}
btns[1].onclick = function () {
axios.post('/axios-server', {
username: 'adim',
password: 123
}, {
params: {
id: 200,
vip: 10
},
headers: {
big: 22,
sma: 11
},
})
}
//通用方法
btns[2].onclick = function(){
axios({
// 请求方法
method:'POST',
// url参数
url:'axios-server',
// url传参
params:{
vip:10,
level:30
},
// 请求头
headers: {
big: 22,
sma: 11
},
// 请求体
data:{
username: 'adim',
password: 123
}
}).then(value => {
console.log(value.data.name);
})
}
</script>
</body>
Fetch发送请求
Fetch('url',{
methods:{
}
}).then(respose => {
return response.json();
}).then(response => {
console.log(response);
})
跨域:遵循同源策略
同源:协议、域名、端口号必须完全相同,违背同源策略就是跨域,AJAX默认遵循
解决跨域
1.JSONP 只支持 get 请求
原理:借助 script 标签天生的跨域能力
2.CORS 跨域资源共享
官方的跨域解决方案,不需要在客户端做任何特殊操作,完全在服务器中进行处理,支持get、post
请求
原理:CORS通过设置一个响应头来告诉浏览器,该请求允许跨域,浏览器收到该响应以后就会对响应放行。
response.setHeader('Access-Control-Allow-Origin', '*');
3.配置代理
devServer: {
proxy: {
'/api': {
tartget: 'http://10.20.151.205:4000',
changeOrign: true
}
}
}








