目录
2.3 Content-Type 和 Content-Length
🌈刚刚我们已经学习完前端三剑客(HTML、CSS、JS)并且完成了博客系统的设计,而一个网站的设计是由前端+后端构成的,那么接下来我们要开始学习后端的知识。
一、了解HTTP
HTTP(超文本传输协议)是一个使用非常广泛的应用层协议
1.回顾 TCP/IP 协议
这个时候我们就需要知道 TCP/IP协议,如果忘记了,可以查看我的博客:【网络原理】TCP/IP 协议
1️⃣应用层:关注传输过来的数据要干啥
负责应用程序间沟通,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等。我们的网络编程主要就是针对应用层。
2️⃣传输层:不考虑中间路径,只关注起点和终点
负责两台主机之间的数据传输。如传输控制协议 (TCP),能够确保数据可靠的从源主机发送到目标主机。
3️⃣网络层:主要负责两个遥远的节点之间 路径规划
负责地址管理和路由选择。例如在IP协议中,通过IP地址来标识一台主机,并通过路由表的方式规划出两台主机之间的数据传输的线路(路由)。路由器(Router)工作在网路层。
4️⃣数据链路层:主要关注的是两个相邻节点之间的传输
负责设备之间的数据帧的传送和识别。例如网卡设备的驱动、帧同步(就是说从网线上检测到什么信号算作新帧的开始)、冲突检测(如果检测到冲突就自动重发)、数据差错校验等工作。
5️⃣物理层:网络通信的基础设施,网络,光纤,网络接口...网络上的高速公路
负责光/电信号的传递方式。比如现在以太网通用的网线(双绞 线)、早期以太网采用的的同轴电缆(现在主要用于有线电视)、光纤,现在的wifi无线网使用电磁波等都属于物理层的概念。
这些协议分层千万不要忘记❗❗❗
2.理解HTTP协议的工作过程
HTTP 是一个“一问一答”这种形式的协议:一个请求对应一个响应
也就是说:HTTP是一个应用层协议,HTTP请求发送出去,就需要从应用层到物理层,层层封装;接收方收到之后,再从物理层到应用层,层层分用,最终才能完成传输
3.HTTP的报文协议格式
这个时候就需要一个抓包工具:本质上相当于一个“代理”,借助这样的代理,就可以看到网络上传输的具体数据
3.1 抓包工具
对于抓包工具,我们使用的是 Fiddler,专注于 http,使用简单(下载地址:Fiddler | Web Debugging Proxy and Troubleshooting Solutions (telerik.com))
1️⃣首次使用,需要开启 https(当前网络上主要的协议是 https,很少直接使用 http)
2️⃣一般,fiddler是正常使用的,但是也会有问题:
- 没有勾选 https,没有安装根证书(无法解析 https 数据的),则抓到的东西就会很少
- fiddler 作为一个代理,可能会和电脑上的其他代理冲突。比如一些浏览器插件,fq 软件,加速器软件(steam++ 不影响 fiddler,steam++ 的原理不是代理,只是自动筛选速度快的 ip,没有转发数据)
3.2 协议格式
二、HTTP 请求
1.首行
首行:包括 HTTP 方法、请求的URL、版本号
1.1 HTTP 方法
描述了 HTTP请求是想要干什么。HTTP协议有很多种方法,不同的方法表示不同的“语义”,主要使用的语义有:GET语义,是“从服务器获取资源”;POST 语义(登陆的时候、上传文件的时候),“往服务器里提交资源”
1.2 GET方法 与 POST方法
1️⃣GET方法常用于获取服务器资源,在浏览器中输入URL,浏览器会向服务器发送一个GET请求(浏览器输入URL默认是GET方法),使用JavaScript中的ajax也能构造GET请求
GET请求的特点:
- 首行的方法为GET
- URL的queryString可以为空,也可以不为空,数据一般存放于queryString中
- body一般为空
2️⃣POST方法常用于将用户输入的数据提交到服务端(如登陆功能),通过HTML中的form标签能构造POST请求,使用JavaScript中的ajax也能构造POST请求
POST请求的特点:
- 首行的方法为POST
- URL的queryString一般为空
- body一般不为空,数据一般保存在body中
1.3 GET 与 POST方法区别(经典面试题)
其实这两个方法没有本质区别,使用 GET 的场景,替换成 POST 一般也可以;使用 POST 的场景替换成 GET 一般也行。
但是在使用习惯上存在区别:
- GET 习惯上用来表示“获取一个数据”,POST 用来表示“提交一个数据”;
- GET 一般没有 body,需要携带数据则放到 URL 中,POST 一般有 body;
- GET 请求通常会设计成幂等的,POST 无要求
- GET 可缓存(前提是幂等),POST 则不能;
- GET 请求可以被浏览器收藏,POST不能
1.4 URL(重要的概念)
唯一资源定位符,描述了网络上的唯一的一个资源
1.5 版本号
版本号有HTTP/1.0、HTTP/1.1、HTTP/1.2、HTTP/1.3(最新版本),最常见常用的是 THHP/1.1
2.请求头 header
header 的整体的格式也是 "键值对" 结构:每个键值对占一行. 键和值之间使用冒号空格分割
2.2 Host
这个属性描述了浏览器这个请求要访问的服务器的地址和端口
这是因为大多数情况下,Host 中的值和 URL 中的域名是一致的;但是例如,当前我们访问的服务器不是直接访问,而是通过”代理“来访问的,此时 Host 和 URL 可能就不一致了(相当于 Host 是最终目标,URL是当前目标)。因此在这里 Host写一遍进而去确认访问的服务器是什么
2.3 Content-Type 和 Content-Length
Content-Type :描述了body 的数据格式
Content-Length:描述了 body 的长度(字节)
Content-Type 常见的写法:application / x-www-from-urlencoded
x-www-from-urlencoded:from 表单提交数据的格式,此时 body 的格式其实就是和 query string 是一样的
username=tz&password=123&uuid=xxxx&status
作为请求, Content-Type 最多就是上边两种写法;作为响应, Content-Type 还有几十种常见的写法:
有了上述格式的描述,浏览器/http 服务器才能狗认识当前的body,并正确进行解析
2.4 User-Agent (简称 UA)
表示用户使用的客户端的是什么样子(属性)
2.5 Referer
表示这个页面是从哪个页面跳转过来的
注意:如果直接在地址栏输入 url,此时请求中没有 referer(如果点收藏夹效果也是一样)
此时我们打开浏览器,搜索一个内容:csdn,然后进行抓包
2.6 Cookie
Cookie 本质:浏览器在本地存储用户自定义数据的一种关键机制
浏览器进行csdn登录页面的时候,知道了我的信息身份,此时我访问csdn里的各个页面就不需要再需重新登录,因为我已经登录过了,浏览器把我的信息记录下来,所以服务器就可以识别,因此浏览器自身是需要进行存储数据的
直接存储到硬盘上是不是就可以?这个事情是万万不可以的,如果允许网页能操作电脑的文件,那么一旦不小心点到一个奇怪的网站,很可能网络就做一些恶意的事情,比如说把银盘上的学习资料一锅端。
为了保证用户上网比较安全,浏览器就会作出限制,禁止网页能够直接访问硬盘:浏览器虽然禁止直接访问硬盘,浏览器提供了 Cookie 机制,允许网页往浏览器存储一些自定义的键值对,这些数据通过浏览器提供的 api,写入特定的文件中
1️⃣Cookie 从哪里来❓❓
从服务器来,当前我们浏览器访问服务器的时候,服务器就会在 HTTP 响应中,通过 Set-Cookie字段,把 Cookie 的键值对但会给浏览器 ;浏览器收到数据,就会在本地存储
2️⃣Cookie 到哪里去❓❓
在下次请求的时候,把 cookie 带给服务器:由上述讲解过程,删除之后再进行请求的时候,就会把 cookie带给服务器;Cookie 在浏览器中只是“暂存”,真正要让这个数据发挥作用,还是有服务器实现
3️⃣Cookie 有啥用❓❓
是浏览器在本地存储数据的机制:存储的数据前提是字符串
由于cookie 存储空间有限,一般不会用 cookie 存太大的数据;存储最典型的应用:存储用户的身份信息(用户登录之后的身份)
2.7 HTTP 中的键值对
今天的知识我们先学到这里,下节课我将详细介绍HTTP响应与HTTPS,其中HTTP与HTTPS也是一道经典面试题