提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
提示:这里可以添加本文要记录的大概内容:
提示:以下是本篇文章正文内容,下面案例可供参考
一.http协议的工作过程应用层协议有很多自定义的协议,也有很多现成的典型的是http协议
例如:登录bing网站
当我们在浏览器中输入一个 "网址", 此时浏览器就会给对应的服务器发送一个 HTTP 请求. 对方服务器收
到这个请求之后, 经过计算处理, 就会返回一个 HTTP 响应

http协议属于典型的一问一答模型的协议
主要学习报文格式:描述http请求是啥,响应是啥
使用抓包工具:捕获请求交互的详细情况
抓包工具相当于一个代理程序,浏览器给服务器发的请求经过这个代理程序,进一步分析出请求和响应的结果如何
什么是代理,举个例子:

代理分类:
正向代理:和客户端关系紧密
反向代理:和服务器关系紧密
http协议是文本格式的协议
我们通过借助抓包工具,分析http协议格式
fiddler(代理工具)
下载地址
https://www.telerik.com/fiddler/
代理工具:fiddeer,使用经典版即可

点击下载:

打开进入后,左侧区域是抓到的请求列表,咱们电脑上,每时每刻都有应用程序,通过http传输数据,都能被fiddler抓到
双击点击某个你想关注的请求详情,就会在右侧窗口显示出请求的具体情况
左上角点击raw最原始的请求:

点击右下角raw得到响应的原始样子

由于响应数据体积较大,服务器通常会返回一个压缩后的结果,点击黄色指式条可以解压缩
注意事项:
1.需要开启fiddler抓取https功能,https可以理解成升级版本的http,在http基础上加了个加密层
菜单栏tools options 全勾

提示框点击允许安装
2.如果开启了上述https,也安装了根证书,还是抓不到,检查电脑上是否安装了其他的代理程序/代理作用浏览器插件

构造一个http请求,本质上就是往一个tcp socket中, 按照下列格式来写入数据即可
http是一个文本格式的协议
以搜狗为例
1.首行:
get https://www.sogou.com/ http/1.1
包括 : a.方法 b. url(描述了网络上唯一资源) c.版本号
2.请求头header
按行组织的键值对,键和值之间使用:空格来分割,键都是有固定含义的
3.空行:
一个http请求header可以有若干个,空行是请求结束的标记,类似链表的bull
4.正文body
有的请求有,有的没
可能是json格式的,也可能是其他格式的
以登录为例:


1.首行
版本号+状态码(一般使用200表示成功)+(ok状态码的描述,对状态码的解释说明)
2.响应报头 header
同样也是键值对结构
3.空行
作为header结束标记
4.正文
http协议的细节
url:唯一资源定位符,用这个来找到网络上的资源(比如某个文件)
uri:唯一资源标识符,这个来区分一个网络上的资源)

1.协议名:url并非是http独有的,很多协议都有,所以前面加上:
2.登录信息:这种用法基本没了
3.服务器地址:服务器地址. 此处是一个 "域名", 域名会通过 DNS 系统解析成一个具体的 IP 地址
4.服务器端口号:基础开发中常用:标识了要访问目标服务器的哪个进程
通过3,4就能确定互联网上哪个主机的哪个进程
5.带层次的文件路径,服务器进程可能会提出很多资源,这些文件可能会放在一个目录中,在url写的路径不一定真的对应到服务器上某个硬盘目录,服务器提供的资源可能是真实存在的也可能是虚拟出来的(直接访问硬盘数据))【开发中常用】
真实存在:访问静态资源

虚拟出来:访问动态资源
例如:可以直接在内存中构造出一个html,(程序员实现的)返回到浏览器这边
6.查询字符串,
query string 中的内容本质是键值对结构. 其中的 key 和 value 的取值和个数, 完全都是程序猿自己约定的. 我们可以通过这样的方式来自定制传输我们需要的信息给服务器.
注意url里的键值对完全是自定义的,程序源决定,header是标准库的
如果特殊符号比如:/?@...也包含在query 里的value,和url的符号产生歧义,浏览器可能会错误的识别,服务器错误的解析,就需要url encode来进行转义(特殊符号,汉字中文),例如,输入c++经过转义会变成

把原始的字符,转成转义后的字符--》url encode(编码)
把转义后的字符还原成原始的字符--》url encode(解码)
作为程序源必须要有这个意识

必须放一个urlencode之后的地址才可以 ,如果不加有些浏览器可能无法正常跳转
因此,查询字符串,是前后端交互数据的重要桥梁
7.片段标识符:
用来区分一个网页中的哪个部分,常见于小说网站或文档网站,借助片段标识符,快速跳转到网页的某个部分
http中非常重要的部分
把方法理解成你这个请求想干啥
GET 是最常用的 HTTP 方法. 常用于获取服务器上的某个资源.
触发方式:
1.在浏览器地址栏直接输入url此时就会触发get
2.在html里面link,a,img,script标签也会触发get请求
href/src都会引用一个外部的资源,本质上就是浏览器就会重新发一个浏览器get请求,来从服务器拿出对应的数据
3.form表单触发get
4.ajax(后面讲)触发get请求
一个浏览器加载出一个页面,往往经过多重http请求的交互(自身和外部资源)
网页缓存:

多用于提交用户输入的数据给服务器(例如登陆页面)
1.form 来post
2.ajax 来post
post没有get用的多但是也是有的,产生post途径
特点:
熟悉以上方法俩中足够应对90%以上场景
get和post没有本质区别(使用get实现的常警,基本都可以使用post代替,post也能用get代替)
a.get的语义:是从服务器上获取某个数据
post的语义,是往服务器上提交个数据
http协议设计的初心,但是在实践中,很多程序员没有遵守,这里是建议设计的时候,采用这样的语义。
b.使用习惯上,给服务器传递的数据,get通常是放在url 的query string中,post通常放在body中
get能否把数据放在body里,也是可以的(很少见,浏览器不一定能支持,其他的http客户端可以支持)
post能否把数据放在query string里,完全可以的(也少见,浏览器啥的都是支持的)
c.get请求建议实现成幂等的,post一般不要求实现成幂等
幂等:输入是确定的输出结果也是确定的
设计服务器的时候,就需要提供一些接口api,传入的参数视为输入,返回的结果是输出,
基于get的api建议设计成幂等,基于post api则无要求
4)在幂等的基础上,get的请求结果是可以被缓存的,post则一般不会缓存
这些缓存是 浏览器默认的行为(如果当前get确实是幂等的,就不必处理,就让浏览器缓存,没问题,如果不是幂等,需要通过特殊技巧避免浏览器产生缓存(典型的技巧就是让每次get请求的url不同(不一样的querystirng)))