1、*三要素
1、HTTP协议(hypertest transport protocol)
2、请求报文
1、请求行
- 若为POST请求,则不在url显示参数
- GET/POST
- ?name=张飞
- HTTP/1.1
2、请求头
- Host: baidu.com
- Cookie: name=周杰伦
- Content-type: text/html
- User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36 Edg/98.0.1108.62
3、空行
4、请求体
- 若为GET请求,则没有请求体
- name=张飞&age=18
3、响应报文
1、响应行
- HTTP/1.1
- 响应状态码:200、404、500
- OK,与码对应的,不需要单独设置
2、响应头
- Content-type: text/html;charset=utf-8
- Content-length: 2048
- Content-encoding: gzip
3、空行
4、响应体
- xxx,页面源代码内容
2、浏览器控制台
3、node.js安装
4、*express框架
1、基本使用
-
npm i express
-
// 001express.js // 1.引入express const express = require("express"); // 2.创建应用对象 const app = express(); // 3.创建路由规则 // request是请求报文的封装 // response是响应报文的封装 app.get("/", function (request, response) { // 设置响应体 response.send("我是傻逼"); }); // 4.监听端口启动服务 app.listen(8000, function () { console.log("服务已经启动,8000端口监听..."); });
-
打开浏览器localhost:8000即可看到效果
2、发送Ajax请求-GET
- 编写js服务端
- 编写页面端
- 发送ajax请求
- 开启js服务端 node xxx.js
-
// 002server.js // 1.引入express const express = require("express"); // 2.创建应用对象 const app = express(); // 3.创建路由规则 // request是请求报文的封装 // response是响应报文的封装 app.get("/server1", function (request, response) { // 设置响应头,设置允许跨域 response.setHeader("Access-Control-Allow-Origin", "*"); // 设置响应体 response.send("Hello GET"); }) // 4.监听端口启动服务 app.listen(8000, function () { console.log("服务已经启动,8000端口监听..."); })
-
// 002GET.html <!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>Ajax请求</title> <style> #result { width: 200px; height: 100px; border: solid 1px #90b; } </style> </head> <body> <button>点击发送请求</button> <div id="result"></div> <!--以下js代码用于发送ajax请求--> <script> var btn = document.getElementsByTagName("button")[0]; var result = document.getElementById("result"); // 绑定事件 btn.onclick = function () { // 1.创建对象,看到xhr就应该想到Ajax var xhr = new XMLHttpRequest(); // 2.初始化 设置请求方法和url以及参数 xhr.open("GET", "http://localhost:8000/server?a=1&b=2&c=3"); // 3.发送 xhr.send(); // 4.事件绑定,处理服务端返回的结果 // on:当xxx的时候 // readystate:是xhr对象的一个属性,表示状态码有:0-4,最初是0,1表示open方法结束,2是send方法完毕,3表示服务端返回了部分结果,4表示服务端返回了所有结果 // change:改变 // 会触发四次 xhr.onreadystatechange = function () { // 1.应该在4的时候才操作 if (xhr.readyState == 4){ // 2.判断响应状态码 // 200 404 500 // 2开头的都是正常运行 if (xhr.status >= 200 && xhr.status < 300){ // 3.处理结果 行、头、(空行)、体 // 3.1.响应行 console.log(xhr.status); // 状态码:200 console.log(xhr.statusText); // 状态字符串:OK // 3.2.响应头 console.log(xhr.getAllResponseHeaders()); // 所有响应头 // 3.3.响应体 console.log(xhr.response); // 响应体 // 4.设置result文本 result.innerHTML = xhr.response; } else{ } } } } </script> </body> </html>
3、发送Ajax请求-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> #result { width: 200px; height: 100px; border: solid 1px #90b; } </style> </head> <body> <div id="result"></div> <script> const result = document.getElementById("result"); result.addEventListener("mouseover", function () { // 1.创建对象 const xhr = new XMLHttpRequest(); // 2.初始化请求类型和url xhr.open("POST", "http://localhost:8000/server2"); // 设置请求头,规定请求体的类型 xhr.setRequestHeader("Context-Type", "text/html;charset=utf-8"); // 需要去js文件设置response.setHeader("Access-Control-Allow-Origin", "*"); // xhr.setRequestHeader("Context-Type", "text/html;charset=utf-8"); // 3.发送请求和参数 // a:1&b:2&c:3 xhr.send("<h1>你好<h1>"); // 4.事件绑定 xhr.onreadystatechange = function () { if (xhr.readyState == 4){ if (xhr.status >= 200 && xhr.status < 300){ result.innerHTML = xhr.response; } } } }) </script> </body> </html>
-
// 1.引入express const express = require("express"); // 2.创建应用对象 const app = express(); // 3.创建路由规则 // request是请求报文的封装 // response是响应报文的封装 app.post("/server2", function (request, response) { // 设置响应头,设置允许跨域 response.setHeader("Access-Control-Allow-Origin", "*"); // 设置响应体 response.send("Hello POST"); }) // 4.监听端口启动服务 app.listen(8000, function () { console.log("服务已经启动,8000端口监听..."); })
4、发送Ajax响应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> #result { width: 200px; height: 100px; border: solid 1px #90b; } </style> </head> <body> <div id="result"></div> <script> const result = document.getElementById("result"); window.onkeydown = function () { // 1.创建对象 const xhr = new XMLHttpRequest(); // 设置响应体类型,就不需要再对json字符串进行转换了 // 自动转成js对象 // xhr.responseType = "json"; // 2.初始化请求方式和url xhr.open("GET", "http://localhost:8000/server3"); // 3.发送请求 xhr.send(); // 4.事件绑定 xhr.onreadystatechange = function () { if (xhr.readyState == 4){ if (xhr.status >= 200 && xhr.status < 300){ // 输出服务器的请求 //手动对数据进行转换 var obj = JSON.parse(xhr.response); console.log(obj); result.innerHTML = obj.name; } } } } </script> </body> </html>
-
// 1.引入express const express = require("express"); // 2.创建应用对象 const app = express(); // 3.创建路由规则 // request是请求报文的封装 // response是响应报文的封装 app.get("/server3", function (request, response) { // 设置响应头,设置允许跨域 response.setHeader("Access-Control-Allow-Origin", "*"); // 设置响应体 var obj = { name: "张飞", age: "18" } var json = JSON.stringify(obj); response.send(json); }) // 4.监听端口启动服务 app.listen(8000, function () { console.log("服务已经启动,8000端口监听..."); })
5、nodemon
- 修改js服务端代码,会自动重启服务,就不需要再去手动重启服务了
-
npm install -g nodemon
6、*IE缓存问题
- 会缓存ajax请求,导致后续调用的是旧的缓存,而不是服务器新发的请求,即改变js文件的响应内容,IE浏览器那边仍然还是上一次的响应内容
-
<!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> #result { width: 200px; height: 200px; border: solid 1px #90b; } </style> </head> <body> <button>点击发送请求</button> <div id="result"></div> <script> const btn = document.getElementsByTagName("button")[0]; const result = document.querySelector("#result"); btn.addEventListener("click", function () { const xhr = new XMLHttpRequest(); // ?t=Date.now()解决缓存问题 xhr.open("GET", "http://localhost:8000/server4?t=" + Date.now()); xhr.send(); xhr.onreadystatechange = function () { if (xhr.readyState == 4){ if (xhr.status >= 200 && xhr.status < 300){ result.innerHTML = xhr.response; } } } }) </script> </body> </html>
-
// 1.引入express const express = require("express"); // 2.创建应用对象 const app = express(); // 3.创建路由规则 // request是请求报文的封装 // response是响应报文的封装 // 专门针对IE缓存的规则 app.get("/server4", function (request, response) { // 设置响应头,设置允许跨域 response.setHeader("Access-Control-Allow-Origin", "*"); // 设置响应体 response.send("Hello IE"); }) // 4.监听端口启动服务 app.listen(8000, function () { console.log("服务已经启动,8000端口监听..."); })
7、请求超时与网络异常处理
- 提醒用户网络不好或者网络超时,提高用户体验性
- 超过时间会自动取消请求
-
控制台选择脱机,进行测试
-
<!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> #result { width: 200px; height: 200px; border: solid 1px #90b; } </style> </head> <body> <button>点击发送请求啊</button> <div id="result"></div> <script> const btn = document.getElementsByTagName("button")[0]; const result = document.querySelector("#result"); btn.addEventListener("click", function () { const xhr = new XMLHttpRequest(); // 超时设置 2s超时设置,js服务端设置响应时间是3s,所以肯定超时!!! xhr.timeout = 3000; // 超时回调 xhr.ontimeout = function () { alert("请求超时,请稍后重试!"); }; // 网络异常回调 xhr.onerror = function () { alert("你的网络似乎有些问题!"); } xhr.open("GET", "http://localhost:8000/server5"); xhr.send(); xhr.onreadystatechange = function () { result.innerHTML = xhr.response; } }); </script> </body> </html>
-
// 1.引入express const express = require("express"); // 2.创建应用对象 const app = express(); // 3.创建路由规则 // request是请求报文的封装 // response是响应报文的封装 app.get("/server5", function (request, response) { // 设置响应头,设置允许跨域 response.setHeader("Access-Control-Allow-Origin", "*"); // 设置响应体,延迟响应 setTimeout(function () { response.send("Hello TimeOut"); }, 3000) }) // 4.监听端口启动服务 app.listen(8000, function () { console.log("服务已经启动,8000端口监听..."); })
8、Ajax取消请求
- 手动取消请求
-
<!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> #result { width: 200px; height: 200px; border: solid 1px #90b; } </style> </head> <body> <button>点击发送请求</button> <button>点击取消请求</button> <div id="result"></div> <script> const btn1 = document.getElementsByTagName("button")[0]; const btn2 = document.getElementsByTagName("button")[1]; const result = document.querySelector("#result"); let xhr = null; btn1.addEventListener("click", function () { xhr = new XMLHttpRequest(); xhr.open("GET", "http://localhost:8000/server6"); xhr.send(); xhr.onreadystatechange = function () { result.innerHTML = xhr.response; } }); btn2.onclick = function () { xhr.abort(); } </script> </body> </html>
-
// 1.引入express const express = require("express"); // 2.创建应用对象 const app = express(); // 3.创建路由规则 // request是请求报文的封装 // response是响应报文的封装 app.get("/server6", function (request, response) { // 设置响应头,设置允许跨域 response.setHeader("Access-Control-Allow-Origin", "*"); // 设置响应体,延迟响应 setTimeout(function () { response.send("Hello TimeOut"); }, 3000) }) // 4.监听端口启动服务 app.listen(8000, function () { console.log("服务已经启动,8000端口监听..."); })
9、Ajax重复请求发送问题
- 防止恶意请求
-
<!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> #result { width: 200px; height: 200px; border: solid 1px #90b; } </style> </head> <body> <button>点击发送请求</button> <script> const btn1 = document.getElementsByTagName("button")[0]; var xhr = null; // 标识变量 var flag = false; btn1.addEventListener("click", function () { // 判断上一次是否请求了 if (flag){ xhr.abort(); } xhr = new XMLHttpRequest(); // 修改标识变量的值 flag = true; xhr.open("GET", "http://localhost:8000/server7"); xhr.send(); xhr.onreadystatechange = function () { if (xhr.readyState == 4){ flag = false; } } }); </script> </body> </html>
-
// 1.引入express const express = require("express"); // 2.创建应用对象 const app = express(); // 3.创建路由规则 // request是请求报文的封装 // response是响应报文的封装 app.get("/server7", function (request, response) { // 设置响应头,设置允许跨域 response.setHeader("Access-Control-Allow-Origin", "*"); // 设置响应体,延迟响应 setTimeout(function () { response.send("Hello TimeOut"); }, 3000) }) // 4.监听端口启动服务 app.listen(8000, function () { console.log("服务已经启动,8000端口监听..."); })
10、*jQuery操作
1、基本请求
- GET
- 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>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
</head>
<body>
<button>GET</button>
<button>POST</button>
<button>通用方式</button>
<script>
// GET
$('button:eq(0)').click(function () {
$.get("http://localhost:8000/server8", {a:100, b:200}, function (data) {
console.log(data);
});
});
// POST 四个参数,最后一个参数为响应体类型
$('button:eq(1)').click(function () {
$.post("http://localhost:8000/server8", {a:100, b:200}, function (data) {
console.log(data);
}, "json");
});
// 通用方法
$('button:eq(2)').click(function () {
$.ajax({
// url
url: "http://localhost:8000/server8",
// 参数
data: {a:100, b:200},
// 请求类型
type: "GET",
// 响应体结果设置
dataType: "json",
// 成功的回调
success: function (data) {
console.log(data);
},
// 失败回调
error: function () {
console.log("出错了");
},
// 超时时间
// timeout: 2000
// 头信息
/* headers: {
}*/
});
});
</script>
</body>
</html>
// 1.引入express
const express = require("express");
// 2.创建应用对象
const app = express();
// 3.创建路由规则
// request是请求报文的封装
// response是响应报文的封装
// GET
app.get("/server8", function (request, response) {
// 设置响应头,设置允许跨域
response.setHeader("Access-Control-Allow-Origin", "*");
// 设置响应体,延迟响应
setTimeout(function () {
response.send("Hello GET");
}, 3000)
});
// POST
app.post("/server8", function (request, response) {
// 设置响应头,设置允许跨域
response.setHeader("Access-Control-Allow-Origin", "*");
// 设置响应体,延迟响应
setTimeout(function () {
response.send("Hello POST");
}, 3000)
});
// 4.监听端口启动服务
app.listen(8000, function () {
console.log("服务已经启动,8000端口监听...");
})
11、同源问题(跨域)
- 同源:协议、域名、端口号必须完全相同
- 跨域:违背同源
1、同源小例子
-
// 1.引入express const express = require("express"); // 2.创建应用对象 const app = express(); // 3.创建路由规则 // request是请求报文的封装 // response是响应报文的封装 app.get("/server9", function (request, response) { // response.sendFile(__dirname + "/010跨域.html"); }); app.get("/data", function (request, response) { response.send("这是数据"); }) // 4.监听端口启动服务 app.listen(8000, function () { console.log("服务已经启动,8000端口监听..."); })
-
<!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> <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js"></script> <style> #result { width: 200px; height: 200px; border: solid 1px #90b; } </style> </head> <body> <h1>你好</h1> <button>点击获取数据</button> <div id="result"></div> <script> $("button:eq(0)").click(function () { $.ajax({ url: "/data", type: "GET", success: function (data) { console.log(data); } }) }) </script> </body> </html>