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的区别
  1. GET和POST没有本质区别 使用GET实现的场景,基本都是可以使用POST代替,使用POST实现的场景,也可以用GET来代替

  2. 语义不同: GET 一般用于获取数据, POST 一般用于提交数据.

  3. 使用习惯上,给服务器传递的数据GET通常放在url 的query string中,POST通常放在body中

  4. GET 请求一般是幂等的, POST 请求一般是不幂等的–> 如果多次请求得到的结果一样, 就视为请求是幂等的.
    (幂等通俗可以理解为输入是确定的,则输出的结果也是确定的)

  5. GET 可以被缓存, POST 一般不能被缓存

避坑!!!

1.关于安全性: 有些资料上说 “POST 比 GET 请安全”. 这样的说法是不科学的. 是否安全取决于前端在传输密码等敏感信息时是否进行加密, 和 GET POST 无关.
2.关于传输数据量: 有的资料上说 “GET 传输的数据量小, POST 传输数据量大”. 这个也是不科学的, 标准没有规定 GET 的 URL 的长度, 也没有规定 POST 的 body 的长度. 传输数据量多少,完全取决于不同浏览器和不同服务器之间的实现区别.
3.关于传输数据类型: 有的资料上说 “GET 只能传输文本数据, POST 可以传输二进制数据”. 这个也是不科学的. GET 的 query string 虽然无法直接传输二进制数据, 但是可以针对二进制数据进行 url encode.

总结

以上就是今天要讲的内容,本文仅仅简单介绍了HTTP协议中的一些需要了解到的知识,详细掌握还需各位多多学习!!!

成大事者不在于力量大小,而在于坚持多久!!!

今天你头秃了码???

本文标签: 初学者