阿华代码,不是逆风,就是我疯
你们的点赞收藏是我前进最大的动力!!
希望本文内容能够帮助到你!!
目录
一:认识HTTP
1:超文本传输
2:发展历史
3:HTML
4:交互过程
5:报文格式
6:HTTP请求格式
7:HTTP的响应格式
二:fiddler
1:介绍
2:设置
三:URL
1:认识URL
2:URL完整结构
3:URLencode
四:HTTP首行方法
1:什么是方法
2:GET
3:POST
(1)POST实践
(2)base64编码
4:POST和GET区别(重点)
5:误区
一:认识HTTP
1:超文本传输
HTTP协议是一种超文本传输协议
文本:就是我们平时说的字符串,可以用utf8/gbk这种码表找到合法的字符
超文本:不仅包含字符串,也可以是一些图片,格式,链接之类的
富文本:比超文本还NB,就是可以设置一些行间距,字体啥的(word文档)
2:发展历史
HTTP主要应用场景:网站,浏览器/客户端和服务器之间传输数据
HTTP2.0和3.0引入了很多特性:①提高传输效率②提高传输安全性
但是1.1版本还是主流版本(IPv6还没有全面覆盖)
3.0版本之前,传输层的协议是基于TCP;
3.0版本之后是基于UDP,这里实现的机制可以确保可靠性,也不拍数据量非常大的包
3:HTML
HTML是一种“编程语言”但是跟C++和Java差别还是比较大的,前者描述的是“内容”,后者表达的是“逻辑”。
我们说的“网页”就是通过HTML来构建的。
HTML和CSS、JavaScript合称为“前端开发三剑客”
4:交互过程
典型的一问一答
打开一个网站,浏览器和服务器之间进行的HTTP交互不是只有一次,而是通常有很多次,第一次交互是拿到这个页面的html
html还会依赖其它的css和js等,heml被浏览器加载之后,又会触发一些其他的http请求............
5:报文格式
这里我们要用到一个工具——fiddler(先看第二部分fiddler安装)
为了节省带宽,以上看到的是被压缩后的数据(一般都是压缩响应,请求不太需要)
下面点击raw可以看到HTTP请求的原始数据
6:HTTP请求格式
(1)首行
包含:方法,URL(后面会讲到),版本号。共计三个部分,用空格分开
(2)请求头
从第二行开始一直到后面都是请求头(类似TCP报头,这里是以文本的形式组织的),报头中包含了很多键值对,每对键值占一行,键和值之间用:分割
(3)空行
请求头最下面会有一个空行,这个空行表示结束标记
(4)正文
也叫body,HTTP的载荷部分
7:HTTP的响应格式
(1)首行
包含:版本号,状态码,状态码的描述(彼此间用空格分割)
(2)响应头
键值对(同请求)
(3)空行
(4)正文(body)
响应的载荷是HTML
二:fiddler
1:介绍
抓包工具——本质上是一个代理程序,能够获取到网络上传输的数据,并显示出来。
注:这里的代理分为:正向代理(客户端的代言人)和反向代理(服务器的代言人)
例如:wireshark——非常齐全,可以抓取各种协议的数据包(包括但不限于:TCP、UDP、IP、以太网),使用比较麻烦
这里我们介绍的fiddler抓包工具(可以自己找资源下载哈),是专注于抓取HTTP协议的数据包。
这里是下载网站——Web Debugging Proxy and Troubleshooting Tools|Fiddler
2:设置
不小心点否的铁铁,只能卸载重新下载一遍了
你的系统中有任何一个程序使用了HTTP/HTTPS此时就都能被fiddler给获取到
三:URL
1:认识URL
URL——唯一资源定位符。描述一个网络上的资源位置
URI——唯一资源标识符(范围更大)
搜索fiddler
查询字符串也是键值对格式,使用&分割键值对;使用=分割键值
2:URL完整结构
(1)登录信息:现在不常用这种写法,都是“单独的登录界面”完成身份验证
(2)服务器地址/端口号:域名也可以是ip地址,如果没有端口号,浏览器会自动分配给你一个端口号(http 80 ;https 443)
(3)带层次的文件路径:可能会对应一个真实的硬盘文件,也可能对应一个虚拟的文件(后面会有例子)
(4)查询字符串:针对请求的内容做的补充说明
总结概括:通过ip知道服务器在哪,通过端口号知道程序是哪个,通过路径知道访问的是哪个资源
(5)片段标识符:用来表示当前页面的某个部分,通过不同的片段标识可以完成当前页面内的跳转
3:URLencode
在URL中本身有些特殊符号具有特定的含义,所以在query String里自定义键值对的时候如果包含同样的符号,就要对上述符号进行“转义”。
对于汉字也是要进行“转义”的,但是如果汉字的“utf8/gbk”等编码值中,某个字节恰好跟某个符号的ASCII码值相同就麻烦了,所以我们就用“%ASCII码”的形式进行表示了,例如
再举个例子搜索“蛋糕”两个字
在实际开发中,当要构造一个URL,尤其是URL中的query string 中要包含中文的时候,务必要进行编码
四:HTTP首行方法
1:什么是方法
把上面的图借用一下,现在我们展开讲方法
方法就是描述这个请求,想干啥
看着这么多方法,其实使用占比:GET占80%场景,POST占10%,剩余占10%可以这么理解
这些语义是“标准文档作者”推荐这么定义的,但实际定义权还是在咱们程序员自己手里
2:GET
GET:从服务器哪一个东西过来(读操作)。非常常见
3:POST
(1)POST实践
POST:网服务器放一个东西过去(写操作)
两个典型的使用场景——①登录②上传
我们打开一个登录界面(比如qq邮箱),然后用fiddler抓包
post请求中最后空行下还有东西就是载荷(正文,body),可以放任意前端和后端约定好的格式
(2)base64编码
这里介绍一个编码,,它的编码规则有标准版(无法作为加密方案),自定义版(可以作为一种简单的加密手段)
base64编码使用四个字节,对原始数据中的三个字节进行重新编码,目的是去除原始数据中的二进制内容(因为有些场合只能存储文本数据)
4:POST和GET区别(重点)
①两者本质上没有区别
使用GET的场景POST也能使用,反之如此,这里取决于你的代码是怎么写的(尤其是服务器和客户端都是自己实现的情况下)
②使用习惯上
GET习惯把数据放到URL的query string,POST习惯放到body中
反过来的话,有的服务器可能不支持GET把数据放到body中
③语义
标准文档中,GET是用来获取数据的,POST的语义是给服务器传输数据的
④幂等性
标准文档中,建议GET请求实现成幂等的,POST无要求
每次输入的内容一定,输出的结果也一定叫“幂等”
每次输入的内容一定,输出的结果不一定不叫“幂等”
⑤GET请求可以被浏览器收藏夹收藏,POST不行
5:误区
误区①:POST比GET安全
说法:登陆的时候,如果使用GET,密码就会显示在URL上,所以POST更安全
解释:即使是使用了POST,如果被抓包了,密码也会暴露
安全的前提在于加密!!!
误区②:GET传输的数据量小(传输的数据量有上限),POST传输的数据量更大
老版本的IE浏览器在实现的时候,对URL有长度限制。实际上HTTP标准文档中说了,对于GET和URL的长度不做限制,目前比较长的URL也是常见的
误区③:GET只能携带文本数据,POST可以携带二进制数据
URL通过query string来携带数据,query string只能包含文本,但是这里可以对二进制数据进行urlencode转换为文本数据,到了服务器在urlencode还原为二进制数据
POST请求中可以直接携带二进制数据,但是也有对二进制数据进行urlencode/base64转码的情况