【计算机网络】深入解析 HTTP 中的 GET 方法、POST 方法和 GET 和 POST 的区别

发布于:2025-03-13 ⋅ 阅读:(308) ⋅ 点赞:(0)

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


网络原理— HTTP “方法” (method)


程序猿大佬有言:”天下方法共十斗,GET 独占八斗,POST 占一斗,剩下的方法占一斗。“

因此,我们只要掌握了GET 和POST,足以应付绝大多数工作情景。


在这里插入图片描述


1. GET方法


GET 是最常用的 HTTP 方法,常用于获取服务器上的某个资源;

在浏览器中直接输入URL,此时浏览器就会发送出一个GET请求;

另外,HTML中的link img script 等标签,也会触发GET请求;

后面我们还会学习,使用 JavaScript 中的 ajax 也能构造 GET请求


使用强制刷新操作,让 fiddler 抓取到包含静态资源的请求结果

在平时的 fiddler 中,抓包的数据中基本都是 HTML,基本没有 CSS 或者 JS

在这里插入图片描述


这时候就有一个小技巧,可以回到浏览器中,按住ctrl后再刷新页面,重新打开 fiddler:

在这里插入图片描述

此时就会发现,fiddler 抓包明显抓到了更多的 css 和 js


原理:

F5 表示刷新,而 ctrl+F5 表示的是强制刷新;


引入浏览器的缓存机制:

  • 浏览器是从服务器,也就是通过网络加载页面的;
  • 我们知道,缓存数据的速度为CPU>内存>硬盘>网络带宽,所以通常来说,从网络带宽中加载数据的速度是慢于硬盘的;
  • 浏览器为了加快访问网页的速度,就会把页面依赖的一些静态资源(css,js,图片,字体,mp3…)缓存到硬盘上;
  • 因此在我们第一次访问服务器时,需要加载包含静态资源的数据;
  • 这些静态资源会在第一次访问服务器时,加载到硬盘上;后续再次访问,就不会再重新加载静态资源的数据了;

  • 如果要在后续的访问中,重新加载静态资源,就需要使用强制刷新操作;

  • 强制刷新会忽略本地缓存,所有资源都从服务器中重新获取一遍;

  • 因此使用强制刷新操作,我们就可以使用 fiddler 抓取到更丰富的请求结果;


使用 Fiddler 观察 GET 请求

打开Fiddler,访问搜狗主页,观察抓包结果:

在这里插入图片描述

在上面的结果中可以看到:


最上面的

在这里插入图片描述

是通过浏览器地址栏发送的GET请求;


下面的和 sogou 域名相关的请求,有些是通过 html 中的 link/script/img 标签产生的,例如

在这里插入图片描述


有些是通过 ajax 的方式产生的,例如

在这里插入图片描述


选中第一条:

在这里插入图片描述


观察请求的详细结果:

在这里插入图片描述


GET 请求的特点

GET :

首行的第一部分为 GET


header :

header 部分有若干个键值对结构;


body :

body 部分为空:


URL query string :

因为 body 部分为空,如果需要通过 GET 给服务器发送数据,可以通过 query string 传递


关于 GET 请求的 URL 长度问题:

网上有些资料上描述:get请求长度最多 1024kb 这样的说法是错误的.


HTTP协议由RFC2616标准定义:

"Hypertext Transfer Protocol–HTTP/1.1,“does not specify any requirement for URL length.”

标准原文中明确说明,没有对 URL 的长度有任何的限制;


  • 实际 URL 的长度,取决于 浏览器的实现和 HTTP服务器端的实现;

  • 在浏览器端,不同的浏览器最大长度是不同的,但是现代浏览器支持的长度一般都很长;

  • 在服务器端,一般这个长度是可以配置的.


2. POST方法


POST 方法也是一种常见的方法,多用于提交用户输入的数据给服务器(例如登陆页面或者上传数据).

通过HTML中的form标签可以构造POST请求,或者使用JavaScript的ajax也可以构造POST请求;


使用 Fiddler 观察 POST 方法

在比特教务系统的登陆页面,输入用户名,密码,验证码之后,点击登陆,就可以看到POST请求:

在这里插入图片描述


点击这个请求,查看请求详情:

在这里插入图片描述


上述是登录操作,对于上传数据操作,请求也会带有 body,body 保存了当前上传数据的内容;

如修改头像等操作, 图片本身是二进制的,通过特殊方式解析转码(base64 编码,把二进制转为文本),在POST请求中,body 部分填入的就是文本数据;

另外, body 既可以填文本数据,也可以直接填二进制数据;


POST请求的特点

POST

首行的第一部分为 POST


URL query string

URL 的 query string 一般为空(也可以不为空)


header :

header 部分有若干个键值对结构;


body :

  • body 部分一般不为空:
  • body 内的数据格式通过 header 中的Content-Type指定;
  • body的长度由header中的Content-Length指定;

3. 经典面试题:谈谈GET和POST的区别


通常情况

从HTTP的定义来看:

  • GET:
    • GET 用于获取资源;
    • 通常情况下,GET 用于请求数据而不改变服务器状态。
  • POST:
    • POST 用于提交数据到服务器;
    • 通常情况下,会改变服务器的状态或产生副作用(如创建或更新资源)。

由于HTTP和浏览器等规定,它们在应用过程中会出现一些区别:

参数传递方式:

  • GET:

    • 参数放在 query String 中,通过 URL 拼接传递
    • 暴露在请求 URL中,具有可见性,长度有限(取决于浏览器和服务器)。
    • body 一般为空,需要传递的数据通过query string传递
  • POST:

    • 参数放在请求体 body 中
    • 通常不可见,长度理论上没有限制;
    • query string 一般为空,需要传递的数据通过 body 传递
    • 更适合传递大量数据(但是注意,POST也可以在URL上放参数!)。

安全性(对于登录场景):

  • GET:

    • 参数可见,数据容易暴露在浏览器历史记录、日志和缓存中
    • 不适合传递敏感信息。
  • POST:

    • 数据放在请求体中,相对安全,但需要 HTTPS 才能保证数据加密传输。

幂等性(如果多次请求得到的结果一样,就视为请求是幂等的):

  • GET:

    • 幂等(重复请求不会改变服务器状态);
    • GET 设计成幂等,就可以允许 GET 请求被缓存;
  • POST:

    • 非幂等(多次请求可能导致重复创建资源或执行多次相同操作);
    • POST 由于不要求幂等,所以 POST 经常是不幂等的,因此 POST 请求不能被缓存;

补充说明

关于语义:

  • GET完全可以用于提交数据,POST也完全可以用于获取数据

关于幂等性:

  • 标准建议 GET 实现为幂等的;
  • 实际开发中 GET 也不必完全遵守这个规则
  • 主流网站都有"猜你喜欢"功能,会根据用户的历史行为,实时更新现有的结果;

关于安全性:

  • 有些资料上说"POST比GET请安全",这样的说法是不科学的;

在这里插入图片描述

  • 是否安全取决于前端在传输密码等敏感信息时,是否进行加密,和GET/ POST无关;

关于传输数据量:

  • 有的资料上说" GET传输的数据量小,POST传输数据量大 ",这个也是不科学的;

在这里插入图片描述

  • 标准没有规定 GET 的 URL 的长度,也没有规定 POST 的 body 的长度;
  • 传输数据量多少,完全取决于不同浏览器和不同服务器之间的实现区别;

关于传输数据类型:

  • 有的资料上说"GET 只能传输文本数据,POST 可以传输二进制数据",这个也是不科学的;

  • GET 的 URL 确实只能放文本( query string 无法直接传输二进制数据),但是可以针对二进制数据进行urlencode(通过 base64 把二进制转码成文本);


4. 其他方法


PUT

  • 与POST相似,只是具有幂等特性,一般用于更新

DELETE

  • 删除服务器指定资源

在这里插入图片描述


OPTIONS

  • 返回服务器所支持的请求方法

HEAD

  • 类似于GET,只不过响应体不返回,只返回响应头

TRACE

  • 回显服务器端收到的请求,测试的时候会用到这个

CONNECT

  • 预留,暂无使用

这些方法的 HTTP请求可以使用 ajax 来构造 (也可以通过一些第三方工具)

  • 任何一个能进行网络编程的语言,都可以构造HTTP请求;

  • 本质上就是通过 TCP socket 写入一个符合 HTTP 协议 规则的字符串.


在这里插入图片描述

在这里插入图片描述


微信公众号

今日签到

点亮在社区的每一天
去签到