概念:
HTTP (全称为 "超文本传输协议") 是一种应用非常广泛的应用层协议;HTTP 往往是基于传 输层的 TCP 协议实现的. (HTTP1.0, HTTP1.1, HTTP2.0 均为TCP, HTTP3 基于 UDP 实现) 目前我们主要使用的还是 HTTP1.1 和 HTTP2.0 .
http请求:本质上就是给tcp socket里写了一个符合http格式的字符串,类似于tcp的报文格式;此时相对应网址的服务器就会返回一个http响应,然后浏览器进行解析后展示成页面内容。
fiddler:
http协议的交互的详细过程可通过fiddler这种第三方工具看到;
所谓抓包的第三方工具就是一个代理程序;故而各种代理之间可能会形成冲突,在使用fiddler时需要关闭其他代理,想要正确抓包还需要开启Https功能;
代理分正向代理和反向代理,前者代表客户端,后者代表服务器;而加速器是指在数据传输时会有很多路径,其只是将数据引导到快捷的高速通道上;
抓包请求:
首行: [方法] + [url] + [版本]
Header: 请求的属性, 冒号分割的键值对;每组属性之间使用\n分隔;遇到空行表示Header部分结束
Body: 空行后面的内容都是Body. Body允许为空字符串. 如果Body存在, 则在Header中会有 一个Content-Length属性来标识Body的长度;
抓包响应:
首行: [版本号] + [状态码] + [状态码解释]
Header: 请求的属性, 冒号分割的键值对;每组属性之间使用\n分隔;遇到空行表示Header部分 结束 Body: 空行后面的内容都是Body. Body允许为空字符串. 如果Body存在, 则在Header中会有 一个Content-Length属性来标识Body的长度; 如果服务器返回了一个html页面, 那么html页 面内容就是在body中.
协议格式:
思考问题: 为什么 HTTP 报文中要存在 "空行"?
因为 HTTP 协议并没有规定报头部分的键值对有多少个. 空行就相当于是 "报头的结束标记", 或者 是 "报头和正文之间的分隔符". HTTP 在传输层依赖 TCP 协议, TCP 是面向字节流的. 如果没有这个空行, 就会出现 "粘包问题".
在请求中会出现相关的方法:实际开发中常见的方法为:post和get;
GET 请求的特点 :首行的第一部分为 GET URL 的 query string 可以为空, 也可以不为空. header 部分有若干个键值对结构. body 部分为空.
POST 请求的特点 :首行的第一部分为 POST URL 的 query string 一般为空 (也可以不为空) header 部分有若干个键值对结构. body 部分一般不为空. body 内的数据格式通过 header 中的 Content-Type 指定. body 的长度由 header 中的 Content-Length 指定.
Host 表示服务器主机的地址和端口.
Content-Length 表示 body 中的数据长度.
Content-Type 表示请求的 body 中的数据格式.
User-Agent (简称 UA) 表示浏览器/操作系统的属性
Referer 表示这个页面是从哪个页面跳转过来的.
Cookie Cookie 中存储了一个字符串, 这个数据可能是客户端(网页)自行通过 JS 写入的, 也可能来自于服务器(服 务器在 HTTP 响应的 header 中通过 Set-Cookie 字段给浏览器返回数据). 往往可以通过这个字段实现 "身份标识" 的功能.
首次登陆网页:
响应中包含了 3 个 Set-Cookie 属性. 其中我们重点关注第三个. 里面包含了一个 gitee-session-n 这样的属性, 属性值是一串很长的加 密之后的信息. 这个信息就是用户当前登陆的身份标识. 也称为 "令牌(token)"
再次访问网页:
请求你中的 Cookie 字段也包含了一个 gitee-session-n 属性, 里面的值和刚才服务器返回的值相 同. 后续只要访问 gitee 这个网站, 就会一直带着这个令牌, 直到令牌过期/下次重新登陆
问题:Post和Get有什么区别?
[1]:get可以给服务器传递信息,传递的信息一般都会放在query string,post传递信息则是通过Body
[2]:语义区别,get用于获取数据,post用于提交数据;post更加安全
[3]:get是会被设计成幂等的(相同的输入得到的结果也是相同的),Post并不要求;
[4]:get可以被缓存,(把请求保存成下来,下次不必真请求,直接取缓存结果),post一般不能缓存;
url:
状态码: