GET 与 POST 其实没有什么区别

本文写于 2020 年 12 月 30 日

GET 与 POST 是两种 HTTP 方法,并且是最常用的两种。

今天在使用 Postman 测试 api 的时候,突发奇想:在 Get 请求的请求体中写 Body 参数,在 Post 请求中写 Query 参数。

居然完全可以运行!

对比起我之前看过的一些文章,所谓的 GET 与 POST 的区别,可以说:网上大部分对二者的分析都是错的,GET 和 POST 没有本质的区别

GET 的 HTTP 报文完全是这样的:

GET /cats?id=1 HTTP/1.1
Host: localhost:3000
Content-Type: application/json
Content-Length: 15 {
"id": 1
}

GET 也可以是这样的:

POST /cats?id=1 HTTP/1.1
Host: localhost:3000
Content-Type: application/json
Content-Length: 15 {
"id": 1
}

发现除了开头的方法不同,别的完全是一模一样的!

如果我们想要知道他们之间的区别,首先我们得明确:什么是 HTTP?什么是 HTTP 方法?

什么是 HTTP

什么是 HTTP 呢?

HTTP 是一种协议,他的设计目的是保证客户端与服务器之间的通信。

HTTP 的工作方式是客户端与服务器之间的「请求」与「应答」。(这个客户端可能是 web 浏览器,也可能是需要联网的本地应用程序)

但是这个「请求」与「应答」不能瞎来啊,我们互相之间得看得懂才行——这就是协议的作用:规定好应该如何请求、应该如何响应。

关于 HTTP 不多做解释,可以看之前一的一篇用简单 Node.js 后台程序看 HTTP 请求

HTTP 方法

而 HTTP 方法呢,顾名思义,就是指在客户端和服务器之间进行「请求-响应」时,被用到的方法。

GET 和 POST 各用一句话来描述:

  • GET 从指定的资源请求数据
  • POST 向指定的资源提交要被处理的数据

常见错误答案

常常会有人分析 GET 与 POST 的区别,这里说一下几个广为流传的“错误答案”,甚至有些 W3C 也是这么写的。

GET 的长度有限制,POST 没有

GET 方法的长度限制是怎么回事?真的有限制吗?

有限制的其实是 URL,如果你愿意把参数写到 GET 请求的 Body 里去,那 GET 请求的长度和 POST 就是一样的了。

并且即使是 URL 的长度限制,那也不是 HTTP 协议的锅。HTTP 协议没有 Body 和 URL 的长度限制,对 URL 限制的大多是浏览器和服务器的原因。

浏览器原因就不说了,服务器是因为处理长 URL 要消耗比较多的资源,为了性能和安全(防止恶意构造长 URL 来攻击)考虑,会给 URL 长度加限制。

并且 POST 也不是没有限制的,只是比较大而已。

  • 通常 GET 请求中的 Query 参数大小是以 k 为单位记录的,根据不同的浏览器和服务器有不同的数据;
  • POST 请求的大小是以 M 为单位记录的,同样取决于服务器。

POST 方法比 GET 方法安全

按照网上大部分文章的解释,POST 比 GET 安全,因为数据在地址栏上不可见。

然而,从传输的角度来说,他们都是不安全的!!!

因为 HTTP 在网络上是明文传输的,只要在网络节点上抓包,就能完整地获取数据报文。

要想安全传输,就只有加密,也就是 HTTPS。

GET 的参数是固定写法

我们必须把 GET 的参数写在 ? 后面,用 & 分割吗?

根本不用。

因为解析报文的过程是通过获取 TCP 数据,用正则等工具从数据中获取 Header 和 Body,从而提取参数。

也就是说,我们可以自己约定参数的写法,只要服务端能够解释出来就行,一种比较流行的写法是 http://www.example.com/user/name/chengqm/age/22。

参考文章:

W3C HTTP 方法:GET 对比 POST

99%的人都理解错了 HTTP 中 GET 与 POST 的区别

都 2019 年了,还问 GET 和 POST 的区别

(完)

GET 与 POST 其实没有什么区别的更多相关文章

  1. c#与java的区别

    经常有人问这种问题,用了些时间java之后,发现这俩玩意除了一小部分壳子长的还有能稍微凑合上,基本上没什么相似之处,可以说也就是马甲层面上的相似吧,还是比较短的马甲... 一般C#多用于业务系统的开发 ...

  2. jquery和Js的区别和基础操作

    jqery的语法和js的语法一样,算是把js升级了一下,这两种语法可以一起使用,只不过是用jqery更加方便 一个页面想要使用jqery的话,先要引入一下jqery包,jqery包从网上下一个就可以, ...

  3. 【原】nodejs全局安装和本地安装的区别

    来微信支付有2年多了,从2年前的互联网模式转变为O2O模式,主要的场景是跟线下的商户去打交道,不像以往的互联网模式,有产品经理提需求,我们帮忙去解决问题. 转型后是这样的,团队成员更多需要去寻找业务的 ...

  4. 探究@property申明对象属性时copy与strong的区别

    一.问题来源 一直没有搞清楚NSString.NSArray.NSDictionary--属性描述关键字copy和strong的区别,看别人的项目中属性定义有的用copy,有的用strong.自己在开 ...

  5. X86和X86_64和X64有什么区别?

    x86是指intel的开发的一种32位指令集,从386开始时代开始的,一直沿用至今,是一种cisc指令集,所有intel早期的cpu,amd早期的cpu都支持这种指令集,ntel官方文档里面称为&qu ...

  6. Java中Comparable与Comparator的区别

    相同 Comparable和Comparator都是用来实现对象的比较.排序 要想对象比较.排序,都需要实现Comparable或Comparator接口 Comparable和Comparator都 ...

  7. MySQL中interactive_timeout和wait_timeout的区别

    在用mysql客户端对数据库进行操作时,打开终端窗口,如果一段时间没有操作,再次操作时,常常会报如下错误: ERROR (HY000): Lost connection to MySQL server ...

  8. 设置line-height:1.5和line-height:150%或者line-height:150px的区别

    直接正题: 看一下line-height可能的值: 其实可以分为两类: (1)不带单位的(如line-height:1.5),这种是推荐使用的: (2)带单位的(如line-heigth:30px/1 ...

  9. C#中Length和Count的区别(个人观点)

    这篇文章将会很短...短到比你的JJ还短,当然开玩笑了.网上有说过Length和count的区别,都是很含糊的,我没有发现有 文章说得比较透彻的,所以,虽然这篇文章很短,我还是希望能留在首页,听听大家 ...

  10. select、poll、epoll之间的区别总结

    select.poll.epoll之间的区别总结 05/05. 2014 select,poll,epoll都是IO多路复用的机制.I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪 ...

随机推荐

  1. Java 中 ++ 操作符是线程安全的吗?

    不是线程安全的操作.它涉及到多个指令,如读取变量值,增加,然后存 储回内存,这个过程可能会出现多个线程交差.

  2. Altium Designer 设置多层方法及各层介绍

    因为PCB板子的层分类有很多,所以通过帮助大家能更好地理解PCB的结构,所以把我所知道的跟大家分享一下 1.PCB各层简介 1. Top Layer顶层布线层(顶层的走线) 2. Bottom Lay ...

  3. HTTP权威指南:第二章

    URL概览 前面提到,URL资源是HTTP协议所使用的寻找资源位置的定位符.分为三个部分,主要的结构是: 方案://服务器/路径 这种结构使得网络上的每一个资源都只有唯一的命名方法,从而使得浏览器可以 ...

  4. python-成绩转换

    本题要求编写程序将一个百分制成绩转换为五分制成绩.转换规则: 大于等于90分为A: 小于90且大于等于80为B: 小于80且大于等于70为C: 小于70且大于等于60为D: 小于60为E. 输入样例: ...

  5. for循环打印九九乘法表

    学习目标: 熟练掌握 for 循环的使用 例题: 需求:打印九九乘法表 代码如下: // 九九乘法表 // row 为行,col为列 for(int row = 1; row < 10; row ...

  6. PL/SQL中的 not

    ELECT * FROM table_name WHERE column_name not like'%山%' 這時出現了column_name中為null值的情況也被剔掉了. 原因是:在SQL的表達 ...

  7. [强网杯2019]upload buuoj

    提示:重点在这,可节省大部分时间 扫描后台 发现www.tar.gz备份文件. 这平台有429[太多请求限制]防护.dirsearch扫描一堆429.于是用了最笨的方法. 文件上传 先注册个账号 注册 ...

  8. SSRF——介绍利用(不全)

    1. SSRF介绍 SSRF(Server-side Request Forge, 服务端请求伪造). 由攻击者构造的攻击链接传给服务端执行造成的漏洞,一般用来在外网探测或攻击内网服务. 2. SSR ...

  9. 从数据库中获取图片编号,然后通过request获取图片下载

    import pandas as pd from pandas.core.dtypes.dtypes import register_extension_dtype from sqlalchemy i ...

  10. MySQL 社区版

    MySQL 社区版 MySQL 社区版是全球广受欢迎的开源数据库的免费下载版本.它遵循 GPL 许可协议,由庞大.活跃的开源开发人员社区提供支持. MySQL 社区版包括: 可插拔的存储引擎架构 多种 ...