admin 管理员组文章数量: 887021
初学者
每天知识多一点 ! 每天烦恼少一点 !
文章目录
- 前言
- 一、HTTP是什么?
- 二、HTTP协议的工作过程
- 三、使用工具观察响应过程
- 1.使用浏览器的开发者工具来观察
- 2.使用fiddler抓包工具来观察
- 1.fiddler下载
- 2.安装
- 3.使用
- 四、协议格式
- 请求(request):
- 1.首行
- 2.请求头 header
- 3.空行
- 4.正文body
- 响应(response):
- 1.首行
- 2.响应报头header
- 3.空行
- 4.正文body
- 五、HTTP协议的一些细节问题
- URL的基本格式
- URL encode
- 方法(method)
- GET方法
- POST方法
- 其他方法
- GET和POST的区别
- 总结
前言
初识HTTP协议,一起探讨HTTP的奇妙之处
一、HTTP是什么?
- 学术定义:
HTTP (全称为 “超文本传输协议”) 是一种应用非常广泛的 应用层协议,同时也是应用层典型的协议. - 个人理解:
1.浏览器和服务器之间的交互,当我们打开一个网页时,大概率都是HTTP协议
2.手机app和服务器之间的交互,大概率也是HTTP协议
3.服务器之间的相互调用,也可以使用HTTP协议
4.HTTP这个协议,是属于最典型的"一问一答"模型的协议
例如:当我们在浏览器中输入一个网址,
敲击回车之后,会加载到页面,这个过程就是HTTP和服务器之间进行了通信
- 发展历程–>(了解即可)
HTTP 诞生与1991年. 目前已经发展为最主流使用的一种应用层协议.HTTP
往往是基于传输层的 TCP 协议实现的. (HTTP1.0, HTTP1.1, HTTP2.0 均为TCP, HTTP3 基于UDP实现),目前我们主要使用的还是 HTTP1.1 和 HTTP2.0.
最新的 HTTP 3 版本也正在完善中, 目前 Google /Facebook 等公司的产品已经支持了
二、HTTP协议的工作过程
具体过程如下:
三、使用工具观察响应过程
因为每一次的HTTP请求/响应我们是无法在客户端上直接察觉到的,所以下面通过俩种方式来抓取到每一次的响应,让我们能够清晰观察到这个详细的过程
1.使用浏览器的开发者工具来观察
本次使用Edge为例
通过 F12 打开 Edge 的开发者工具, 切换到 Network/网络 标签页. 点击京东之后即可看到如下图效果. 每一条记录都是一次 HTTP 请求/响应
2.使用fiddler抓包工具来观察
1.fiddler下载
直接在浏览器中搜索fiddler 注意,下载时不要点击带广告字样的链接!!!
在官网中下载经典版即可
2.安装
此处为绿色安装,直接修改好安装路径之后直接安装即可!
3.使用
找到安装好的,双击启动
整个软件页面可以分为三个部分:
第一部分为抓到的请求列表,咱们的电脑每时每刻都有应用程序,通过http传输数据,这些请求的数据都能被Fiddler抓取到~
双击一条请求之后我们可以看到请求的详细情况:
右上方是请求的详细情况,然后点击row这个选项按钮,我们就能看到一个HTTP请求的最原始的样子!
右下方是响应的详细情况,依然是点击row这个选项按钮,我们就能看到HTTP响应的最原始的样子!
这里的黄色按钮为解压缩操作,由于响应所返回的数据量较大,所以会将数据进行压缩传输,这样可以减少体积减少网络带宽.
点击之后就可以解压缩,看到具体的内容.
点击这个按钮之后,我们可以将详细信息用记事本打开,更方便观察
注意!!!
1.打开软件之后会出现网络卡顿问题,这个不必要担心.毕竟你的响应要经过这个软件,所以会使速度变慢.
2.使用fiddler软件时,不要和其他加速软件共同使用,例如Steam++,或者某些梯zi等工具
四、协议格式
协议格式分为俩部分:
请求(request):
这里我们通过抓取请求 搜狗 页面请求为例;
下图就为一个完整的HTTP请求样式,
如图可知,如果我们想要构造一个HTTP请求,本质上就是通过往一个TCP socket中按照下面格式来填写数据即可!
我们来具体分析一下:
1.首行
GET:为HTTP的一个方法
/
称为URL,描述了网络上的唯一资源,可以理解为地址
HTTP/1.1 : 版本号
2.请求头 header
除去第一行其余的内容称为请求头
这里是一个按行组织的键值对,每一行,都是一个键值对.键和值之间使用 ; 来分割
3.空行
在文档的最后俩行.
空行的作用:请求头的结束标记
一个HTTP请求的header可以有若干个,就使用空行来作为header的结束标记,类似于链表的null
4.正文body
但是正文并不是所有都有,有些请求不含有body
响应(response):
这里还是使用 点击搜狗 页面之后通过抓包工具获得的响应数据
这里具体分析一下:
1.首行
HTTP/1.1 200
HTTP/1.1:版本号
200 :状态码(可能后边会有一个OK 这里是对状态码解释说明)
2.响应报头header
这里同样也是键值对,与请求报头基本类似
3.空行
作为header的结束标记
4.正文body
这里可以是json格式,也可以是HTML格式
五、HTTP协议的一些细节问题
URL的基本格式
平时我们俗称的 “网址” 其实就是说的 URL (Uniform Resource Locator 统一资源定位符).
互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它.
URL 的详细规则由 因特网标准RFC1738 进行了约定
这里补充一个知识:
URI :唯一资源标识符 用来区分一个网络上的资源
这俩概念非常相似,很多时候不会显式区分
例如:
如下为百度页面的链接.就为一个URL
=%E7%99%BE%E5%BA%A6&cvid=da2e7c5925424e9ab409ec762168bafb&aqs=edge.0.69i59j0j69i59j0l2j69i65j69i61l2j69i65.1406j0j1&FORM=ANAB01&PC=DCTS
> 1.https:// 协议方案名
>
> 2.cn.bing.com/search 服务器地址,也可以写作域名,
> 域名和IP地址是一个等价的关系.DNS域名解析系统,帮我们自动把域名转成IP地址
>
> 3.有些URL中还有端口号,用:进行分隔. 端口号标识了要访问目标服务器的哪一个进程.
> 端口号省略的时候, 浏览器会根据协议类型自动决定使用哪个端口.
> 例如 http 协议默认使用 80 端口, https 协议默认使用 443 端口.
>
> 4.q=%E7%99%BE%E5%BA%A6&cvid=da2e7c5925424e9ab409ec762168bafb&aqs=edge.0.69i59j0j69i59j0l2j69i65j69i61l2j69i65.1406j0j1&FORM=ANAB01&PC=DCTS
> 这个为查询字符串,对URL进一步的解释.其本质是一个键值对结构. 键值对之间使用 & 分隔. 键和值之间使用 = 分隔.
>
> 5片段标识: 此 URL 中省略了片段标识. 片段标识主要用于页面内跳转. (例如 Vue 官方文档: .html, 通过不同的片段标识跳转到文档的不同章节)
URL encode
像 / ? : 等这样的字符, 已经被url当做特殊意义理解了. 因此这些字符不能随意出现.
比如, 某个参数中需要带有这些特殊字符, 就必须先对特殊字符进行转义. 一个中文字符由 UTF-8 或者 GBK 这样的编码方式构成,
虽然在 URL 中没有特殊含义, 但是仍然需要进行转义. 否则浏览器可能把 UTF-8/GBK 编码中的某个字节当做 URL中的特殊符号.
转义的规则如下: 将需要转码的字符转为16进制,然后从右到左,取4位(不足4位直接处理),每2位做一位,前面加上%,编码成%XY格式
例如:“+” 被转义成了 “%2B”
urldecode就是urlencode的逆过程;
URLencode工具
方法(method)
这里可以理解为 我们所发送的请求是想要做什么
小故事:
东晋时期的谢灵运.天下文采有十斗,曹植占八斗,他自已占一斗,剩余的其他人共享一斗~~
GET 占其八斗,POST占一斗,其余共享一斗!!!
GET方法
GET 是最常用的 HTTP 方法. 常用于获取服务器上的某个资源. 在浏览器中直接输入 URL, 此时浏览器就会发送出一个 GET
请求. 另外, HTML 中的 link, img, script 等标签, 也会触发 GET 请求.
例如:
打开 Fiddler, 访问 搜狗主页, 观察抓包结果.在上面的结果中可以看到:
最上面的
是通过浏览器地址栏发送的 GET 请求.
下面的和 sogou 域名相关的请求, 有些是通过 html 中的 link/script/img 标签产生的, 例如
GET 请求的特点
首行的第一部分为 GET
URL 的 query string 可以为空, 也可以不为空.
header部分有若干个键值对结构.
body 部分为空.
网上有些资料上描述: get请求长度最多1024kb 这样的说法是错误的.
HTTP 协议由 RFC 2616 标准定义, 标准原文中明确说明: "Hypertext Transfer Protocol --HTTP/1.1," does not specify any requirement for URL length.
没有对 URL 的长度有任何的限制
POST方法
POST 方法也是一种常见的方法. 多用于提交用户输入的数据给服务器(例如登陆页面).
通过 HTML 中的 form 标签可以构造 POST 请求, 或者使用 JavaScript 的 ajax 也可以构造 POST 请求.
POST 请求的特点
首行的第一部分为 POST
URL 的 query string 一般为空 (也可以不为空)
header 部分有若干个键值对结构.
body 部分一般不为空. body 内的数据格式通过 header 中的 Content-Type 指定. body 的长度由header 中的 Content-Length 指定.
其他方法
PUT 与 POST 相似,只是具有幂等特性,一般用于更新
DELETE 删除服务器指定资源
OPTIONS 返回服务器所支持的请求方法
HEAD 类似于GET,只不过响应体不返回,只返回响应头
TRACE 回显服务器端收到的请求,测试的时候会用到这个
CONNECT 预留,暂无使用
GET和POST的区别
-
GET和POST没有本质区别 使用GET实现的场景,基本都是可以使用POST代替,使用POST实现的场景,也可以用GET来代替
-
语义不同: GET 一般用于获取数据, POST 一般用于提交数据.
-
使用习惯上,给服务器传递的数据GET通常放在url 的query string中,POST通常放在body中
-
GET 请求一般是幂等的, POST 请求一般是不幂等的–> 如果多次请求得到的结果一样, 就视为请求是幂等的.
(幂等通俗可以理解为输入是确定的,则输出的结果也是确定的) -
GET 可以被缓存, POST 一般不能被缓存
避坑!!!
1.关于安全性: 有些资料上说 “POST 比 GET 请安全”. 这样的说法是不科学的. 是否安全取决于前端在传输密码等敏感信息时是否进行加密, 和 GET POST 无关.
2.关于传输数据量: 有的资料上说 “GET 传输的数据量小, POST 传输数据量大”. 这个也是不科学的, 标准没有规定 GET 的 URL 的长度, 也没有规定 POST 的 body 的长度. 传输数据量多少,完全取决于不同浏览器和不同服务器之间的实现区别.
3.关于传输数据类型: 有的资料上说 “GET 只能传输文本数据, POST 可以传输二进制数据”. 这个也是不科学的. GET 的 query string 虽然无法直接传输二进制数据, 但是可以针对二进制数据进行 url encode.
总结
以上就是今天要讲的内容,本文仅仅简单介绍了HTTP协议中的一些需要了解到的知识,详细掌握还需各位多多学习!!!
成大事者不在于力量大小,而在于坚持多久!!!
今天你头秃了码???
本文标签: 初学者
版权声明:本文标题:初学者 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1687337531h91127.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论