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 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、200
转发:
转发代理服务器:
①ForwardProxy:客户端无法直接请求服务器,只能将请求发往转发代理服务器(简称代理服务器),代理服务器将请求转发给服务器,接收到服务器响应后再将响应转发回客户端。
②适用于客户端从内部网络访问外部网络时,可能由于防火墙的存在无法直接访问外网,这时需要借助转发代理服务器访问外部网络(防火墙可能配置了只允许转发代理服务器与外部通信及一些其他规则)。有时为了加速代理服务器响应,可能会采用缓存技术。整个过程如:反向代理服务器:
①Reverse Proxy:反向代理服务器用来代理服务器接收客户端请求,对于客户端来说,其感知不到反向代理的存在。考虑到服务器集群的安全,可以将反向代理服务器架设在防火墙外,接收到客户端请求后,反向代理服务器透过防火墙将请求转发到不同的服务器,再将服务器的响应回应给客户端(防火墙可以设置只允许反向代理服务器与真实服务器集群交互)。
②反向代理服务器也可能采用缓存技术,整个过程如下图(结构与转发代理服务器差不多):在代理转发场景,用户端发送一次请求就可以获得响应,无需关注转发代理服务器或者反向代理服务器做了什么。而在重定向场景,客户端至少要发送两次请求才能得到想要的结果。
重定向:
- 客户端向服务器请求资源A,服务器发现A在其他地方,于是返回301 Move Permanently给客户端,告诉客户端该资源被永久移动到位置B(通过响应头部的Location字段):
- 然后客户端重新请求资源B得到想要的结果:
- 重定向时,如果该资源是被临时移动,服务端可能会返回302 Temporarily Moved,但是302响应可能会被搜索引擎认为是在作弊,所以日常开发最好使用301Move Permanently 。
- 最后,请求一个资源有可能发生多次重定向行为(请求A,被重定向到B,又被重定向到C,…,最后得到真正的资源)。
转发与重定向:
因此重定向的第一次请求的response报文体是为空的,第二次请求才有内容。
而转发的response报文体是有内容的。
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>
- 现在已经被 JSON 取代了。
用 JSON 表示:
{"name":"孙悟空","age":18,"gender":"男"}
AJAX 的优点:
- 可以无需刷新页面而与服务器端进行通信。
- 允许你根据用户事件来更新部分页面内容
AJAX 的缺点:
- 没有浏览历史,不能回退
- 存在跨域问题(同源)
- SEO 不友好
①对于seo搜索引擎优化,ajax网页内容爬虫爬取不到
SEO简介:
- 为搜索引擎优化,利用搜索引擎的规则提高网站在有关搜索引擎内的自然排名。
- 目的是:为网站提供生态式的自我营销解决方案,让其在行业内占据领先地位,获得品牌收益。
Express 简介
Express 简介:
- Express 是一个简洁而灵活的 node.js Web应用框架, 提供了一系列强大特性帮助你创建各种 Web 应用,和丰富的 HTTP工具。
- 使用 Express 可以快速地搭建一个完整功能的网站。
- Express 框架核心特性:
①可以设置中间件来响应 HTTP 请求。
②定义了路由表用于执行不同的 HTTP 请求动作。
③可以通过向模板传递参数来动态渲染 HTML 页面。
express的基本使用:
//1. 引入express
const express = require('express');
//2. 创建应用对象
const app = express();
//3. 创建路由规则
// request 是对请求报文的封装
// response 是对响应报文的封装
app.get('/', (request, response)=>{
//设置响应
response.send('HELLO EXPRESS');
});
//4. 监听端口启动服务
app.listen(8000, ()=>{
console.log("服务已经启动, 8000 端口监听中....");
});
AJAX 的使用
核心对象 XMLHttpRequest:
- AJAX 的所有操作都是通过该对象进行的。
- 使用步骤
1) 创建 XMLHttpRequest 对象
var xhr = new XMLHttpRequest();
2)设置请求信息
xhr.open(method, url);
//可以设置请求头,一般不设置
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
3)发送请求
xhr.send(body)
//get 请求不传 body 参数,只有 post 请求使用
4) 接收响应
//xhr.responseXML 接收 xml 格式的响应数据
//xhr.responseText 接收文本格式的响应数据
xhr.onreadystatechange = function (){
if(xhr.readyState == 4 && xhr.status == 200){
var text = xhr.responseText;
console.log(text);
}
}
解决 IE 缓存问题:
- 问题:在一些浏览器中(IE),由于缓存机制的存在,ajax 只会发送的第一次请求,剩余多次请求不会在发送给浏览器而是直接加载缓存中的数据。
- 解决方式:浏览器的缓存是根据 url 地址来记录的,所以我们只需要修改 url 地址 即可避免缓存问题
xhr.open("get","/testAJAX?t="+Date.now());
超时与网络异常:
//超时回调
xhr.ontimeout = function(){
alert("网络异常, 请稍后重试!!");
}
//网络异常回调
xhr.onerror = function(){
alert("你的网络似乎出了一些问题!");
}
取消请求:
x.abort();
AJAX 请求状态:
- xhr.readyState 可以用来查看请求当前的状态
- XMLHttpRequest.readyState
0: 表示 XMLHttpRequest 实例已经生成,但是 open()方法还没有被调用。
1: 表示 send()方法还没有被调用,仍然可以使用 setRequestHeader(),设定 HTTP 3请求的头信息。
2: 表示 send()方法已经执行,并且头信息和状态码已经收到。
3: 表示正在接收服务器传来的 body 部分的数据。
4: 表示服务器数据已经完全接收,或者本次接收已经失败了
jQuery 中的 AJAX
get 请求:
$.get(url, [data], [callback], [type])
url:请求的 URL 地址。
data:请求携带的参数。
callback:载入成功时回调函数。
type:设置返回内容格式,xml, html, script, json, text, _default。
post 请求:
$.post(url, [data], [callback], [type]) u
rl:请求的 URL 地址。
data:请求携带的参数。
callback:载入成功时回调函数。
type:设置返回内容格式,xml, html, script, json, text, _default。
ajax通用请求:
$.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
}
});
dataType如果指定为json类型,则会把获取到的数据作为一个JavaScript对象来解析,并且把构建好的对象作为结果返回。
axios 和fetch中的ajax
axios:
//GET 请求
axios.get('/axios-server', {
//url 参数
params: {
id: 100,
vip: 7
},
//请求头信息
headers: {
name: 'atguigu',
age: 20
}
}).then(value => {
console.log(value);
});
fetch:
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);
});
跨域
同源策略:
- 同源策略(Same-Origin Policy)最早由 Netscape 公司提出,是浏览器的一种安全策略。
同源: 协议、域名、端口号必须完全相同。
违背同源策略就是跨域。
- 举例:在本地打开HTML文件使用的是file协议。但发请求使用的是http协议。因此跨域!
JSONP解决跨域 :
-
JSONP(JSON with Padding),是一个非官方的跨域解决方案,纯粹凭借程序员的聪明 才智开发出来,只支持 get 请求。
-
JSONP 怎么工作的?
在网页有一些标签天生具有跨域能力,比如:img link iframe script。 JSONP 就是利用script 标签的跨域能力来发送请求的。
-
JSONP 的使用:
-
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)+")");
});
- 此外在 jQuery 中的 JSONP
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<button id="btn">按钮</button>
<ul id="list"></ul>
<script type="text/javascript" src="./jquery-1.12.3.js"></script>
<script type="text/javascript">
window.onload = function () {
var btn = document.getElementById('btn')
btn.onclick = function () {
$.getJSON("http://api.douban.com/v2/movie/in_theaters?callback=?",
function (data) {
console.log(data);
//获取所有的电影的条目
var subjects = data.subjects;
//遍历电影条目
for(var i=0 ; i<subjects.length ; i++){
$("#list").append("<li>"+ subjects[i].title+
"<br/>"+ "<img src=\""+subjects[i].images.large+
"\" >"+ "</li>");
}
});
}
}
</script>
</body>
</html>
CORS解决跨域 :
-
CORS(Cross-Origin Resource Sharing),跨域资源共享。CORS 是官方的跨域解决方案,它的特点是不需要在客户端做任何特殊的操作,完全在服务器中进行处理,支持 get 和 post 请求。跨域资源共享标准新增了一组HTTP 首部字段,允许服务器声明哪些 源站通过浏览器有权限访问哪些资源
-
CORS 是通过设置一个响应头来告诉浏览器,该请求允许跨域,浏览器收到该响应 以后就会对响应放行。
-
CORS 的使用:
①主要是服务器端的设置:
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 返回的响应");
});
VSCode和HBuilder中运行html的问题:
- 在html中使用ajax可以访问本地文件,因为是在编译器里运行html,而编译器是本地地址中某个端口上运行的程序。
因此用ajax发送http请求可以访问本地文件,而不是使用file协议。
总结:
- 链接:js处理的8种跨域方法