草庐IT

[ 网络协议篇 ] 一篇文章让你掌握 GET 和 POST 的区别(非常全面)

_PowerShell 2023-10-30 原文

  🍬 博主介绍  

  • 👨‍🎓 博主介绍:大家好,我是 _PowerShell ,很高兴认识大家~
  • ✨主攻领域:【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】
  • 🎉点赞➕评论➕收藏 == 养成习惯(一键三连)😋
  • 🎉欢迎关注💗一起学习👍一起讨论⭐️一起进步📝文末有彩蛋
  • 🙏作者水平有限,欢迎各位大佬指点,相互学习进步!

在前面我们已经讲了,什么是 HTTP,什么是 HTTPS,HTTP 和 HTTPS 的区别等内容。

这篇文章我们从原理和表象两个方面来谈一谈 HTTP 的 POST 请求和 GET 请求两种请求方式的区别。理解这个两个的区别是很重要的,这个也是面试常问的。

干货:

表象区别:

1. 概念:GET 是获取数据; POST 是提交/修改数据

2. 位置:GET 把请求的数据放在url上,以?分割URL和传输数据,参数之间以&相连,所以GET不太安全;而POST把数据放在HTTP的包体内(request body)

3. 大小:GET 提交的数据最大限制实上取决于浏览器和后端服务 ; POST数据长度取决于服务器的处理能力。

4. 安全:POST更安全

本质区别:

5. GETPOST最大的区别主要是GET请求是幂等性的,POST请求不是。

其他区别:

6. GET产生一个TCP数据包,浏览器会把http header和data 一并发送出去,服务器响应200(返回数据); POST 产生两个TCP数据包,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok返回数据)

7. GET请求会被浏览器主动缓存;而POST不会,除非手动设置

8. GET在浏览器回退时是无害的,而POST会再次提交请求。

9. 服务器获取GET和POST数据方式不同

目录

  🍬 博主介绍  

干货:

一、请求方式所在请求报文中的位置

请求方法请求报文请求行里面

二、HTTP 的请求方法

三、GET 和 POST 区别

1. get

2. POST

3. 表面现像上面看看GET和POST的区别

1. 请求的数据所在的位置不同

2. 请求数据的大小不同

3. 服务端获取请求数据方面

4. 安全性方面

四、从原理方面看GET和POST的区别

1. 根据HTTP规范,GET用于信息获取,是安全的和幂等的。

2.根据HTTP规范,POST表示可能修改变服务器上的资源的请求。

五、HTML中GET请求数据的大小限制

1. 浏览器

2. 服务器

六、专栏分享


一、请求方式所在请求报文中的位置

HTTP 报文由从客户机到服务器的请求和从服务器到客户机的响应构成。

请求方法请求报文请求行里面

请求报文格式如下:

请求行、请求头、空行、请求体

二、HTTP 的请求方法

HTTP 规范定义了9种请求方法,每种请求方法规定了客户和服务器之间不同的信息交换方式,常用的请求方法是GET和POST。服务器将根据客户请求完成相应操作,并以应答块形式返回给客户,最后关闭连接。

HTTP1.0 定义了三种请求方法: GET, POST 和 HEAD 方法。

HTTP1.1 新增了六种请求方法:OPTIONS、PUT、PATCH、DELETE、TRACE 和 CONNECT 方法。

序号方法描述
1GET请求指定的页面信息,并返回实体主体。
2HEAD类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头
3POST向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST 请求可能会导致新的资源的建立和/或已有资源的修改。
4PUT从客户端向服务器传送的数据取代指定的文档的内容。
5DELETE请求服务器删除指定的页面。
6CONNECTHTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。
7OPTIONS允许客户端查看服务器的性能。
8TRACE回显服务器收到的请求,主要用于测试或诊断。
9PATCH是对 PUT 方法的补充,用来对已知资源进行局部更新 。

三、GET 和 POST 区别

1. get

请求指定的页面信息,并返回实体主体。

2. POST

向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。

数据被包含在请求体中。

POST 请求可能会导致新的资源的建立和/或已有资源的修改。

3. 表面现像上面看看GET和POST的区别

HTTP 定义了上述九种与服务器交互的不同方法,但最基本的方法有4种,分别是GET,POST,PUT,DELETE。

URL全称是资源描述符,可以这样理解:一个URL地址,它用于描述一个网络上的资源,而HTTP中的GET,POST,PUT,DELETE就对应着对这个资源的查,改,增,删4个操作。

那也就是说:GET一般用于获取/查询资源信息,而POST一般用于更新资源信息。

1. 请求的数据所在的位置不同

GET请求的数据会附在URL之后,以?分割URL和传输数据,参数之间以&相连

举例来说:

?进行分割  &连接参数

https://so.csdn.net/so/search?q=网络&t=&u=&urw=

POST把提交的数据则放置在是HTTP包的包体中

2. 请求数据的大小不同

GET方式请求数据最多只能是1024字节

URL不存在参数上限的问题,HTTP协议规范没有对URL长度进行限制

GET请求数据的长度取决于URL的长度,URL的长度取决于浏览器和服务器对URL的限制

注意:这是限制是整个URL长度,也就是说GET请求数据 < URL长度。

详细请看第五点:HTML中GET请求数据的大小限制

理论上POST没有限制,可传较大量的数据

POST是没有大小限制的,HTTP协议规范也没有进行大小限制

POST请求数据大小限制取决于服务器的处理程序的处理能力

如: IIS 6.0默认ASP POST数据量最大为200KB,每个表单域限制是100KB。
        IIS 6.0默认上传文件的最大大小是4MB。
        IIS 6.0默认最大请求头是16KB。
   IIS 6.0之前没有这些限制。

3. 服务端获取请求数据方面

服务端获取GET请求数据和POST请求数据的方式不同

举例来说:

在ASP中,服务端获取GET请求参数用Request.QueryString,获取POST请求参数用Request.Form。

4. 安全性方面

POST的安全性要比GET的安全性高

举例来说:

通过GET提交数据,用户名和密码将明文出现在URL上

登录页面有可能被浏览器缓存,其他人查看浏览器的历史纪录,那么别人就可以拿到你的账号和密码了。

除此之外,使用GET提交数据还可能会造成Cross-site request forgery攻击。

四、从原理方面看GET和POST的区别

1. 根据HTTP规范,GET用于信息获取,是安全的和幂等的。

1. 所谓安全的意味着该操作用于获取信息而非修改信息。

说白了,GET 请求一般不应产生副作用。

也就是说,它仅仅是获取资源信息,就像数据库查询一样,不会修改,增加数据,不会影响资源的状态。

 注意:这里安全的含义仅仅是指是非修改信息。

2. 幂等的意味着对同一URL的多个请求应该返回同样的结果。

幂等是一个数学或计算机学概念,常见于抽象代数中。

对于单目运算,如果一个运算对于在范围内的所有的一个数多次进行该运算所得的结果和进行一次该运算所得的结果是一样的,那么我们就称该运算是幂等的。

对于双目运算,则要求当参与运算的两个值是等值的情况下,如果满足运算结果与参与运算的两个值相等,则称该运算幂等。

应用在这里:幂等性是指一次和多次请求某一个资源应该具有同样的副作用。简单来说意味着对同一URL的多个请求应该返回同样的结果。

幂等性也没有那么的严格,举个例子:

同一个URL请求的时同一篇博客文章,即使文章被修改了请求的还是这篇文章,这个资源。

2.根据HTTP规范,POST表示可能修改变服务器上的资源的请求。

举个例子:

博客评论通过POST实现,因为在评论提交后站点的资源已经不同了,也就是说说资源被修改了。

五、HTML中GET请求数据的大小限制

1. 浏览器

1. IE:

IE浏览器(Microsoft Internet Explorer) 对url长度限制是2083(2K+53),超过这个限制,则自动截断(若是form提交则提交按钮不起作用)。

2. firefox

firefox(火狐浏览器)的url长度限制为 65 536字符,但实际上有效的URL最大长度不少于100,000个字符。

3. chrome

chrome(谷歌)的url长度限制超过8182个字符返回本文开头时列出的错误。

4. Safari

Safari的url长度限制至少为 80000 字符。

5. Opera

Opera 浏览器的url长度限制为190 000 字符。Opera 9 地址栏中输入190 000字符时依然能正常编辑。

2. 服务器

1、Apache

Apache能接受url长度限制为8 192 字符

2. IIS

Microsoft Internet Information Server(IIS)能接受url长度限制为16 384个字符。

IIS7中这个是可以通过修改的。

3. Perl HTTP::Daemon

Perl HTTP::Daemon 至少可以接受url长度限制为8000字符。

Perl HTTP::Daemon中限制HTTP request headers的总长度不超过16384字节(不包括post,file uploads等)。

但当url超过8000字符时会返回413错误。

这个限制可以被修改,在Daemon.pm查找16×1024并更改成更大的值。

4. ngnix

可以通过修改配置来改变url请求串的url长度限制。

client_header_buffer_size 默认值:client_header_buffer_size 1k

large_client_header_buffers默认值 :large_client_header_buffers 4 4k/8k

六、专栏分享

每个专栏都在持续更新中~~~

渗透测试自学篇        web基础知识点

网络基础                   面试总结

网络工程师                python

操作系统篇                通讯安全

闲聊                           漏洞复现篇

代码审计                    SSM

docker                        环境搭建篇

python爬虫                 靶场

心理学

系列文章:

[ 网络协议篇 ] 一篇文章让你掌握什么是 HTTPS ?

[ 网络协议篇 ] 一篇文章让你掌握什么是 HTTP ?

[ 网络协议篇 ] 一篇文章让你掌握什么是 数字证书 ?什么是SSL ?什么是 TLS ?

HTTP状态码表

参考文章:

html中get请求方式发送数据的大小限制详解 - cheng825 - 博客园 (cnblogs.com) 

 (8条消息) HTTP请求方式GET和POST的区别详解_buliedian-CSDN博客

(9条消息) [ 网络协议篇 ] 一篇文章让你掌握什么是 HTTP ?__PowerShell的博客-CSDN博客

(8条消息) http请求的post和get方式的区别_编程小咯喽的博客-CSDN博客_post和get请求的区别POST与GET的区别 - 知乎 (zhihu.com)
(8条消息) http请求的post和get方式的区别_编程小咯喽的博客-CSDN博客_post和get请求的区别

有关[ 网络协议篇 ] 一篇文章让你掌握 GET 和 POST 的区别(非常全面)的更多相关文章

  1. ruby - Facter::Util::Uptime:Module 的未定义方法 get_uptime (NoMethodError) - 2

    我正在尝试设置一个puppet节点,但ruby​​gems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由ruby​​gems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby

  2. ruby - 如何模拟 Net::HTTP::Post? - 2

    是的,我知道最好使用webmock,但我想知道如何在RSpec中模拟此方法:defmethod_to_testurl=URI.parseurireq=Net::HTTP::Post.newurl.pathres=Net::HTTP.start(url.host,url.port)do|http|http.requestreq,foo:1endresend这是RSpec:let(:uri){'http://example.com'}specify'HTTPcall'dohttp=mock:httpNet::HTTP.stub!(:start).and_yieldhttphttp.shou

  3. ruby-on-rails - rails : How to make a form post to another controller action - 2

    我知道您通常应该在Rails中使用新建/创建和编辑/更新之间的链接,但我有一个情况需要其他东西。无论如何我可以实现同样的连接吗?我有一个模型表单,我希望它发布数据(类似于新View如何发布到创建操作)。这是我的表格prohibitedthisjobfrombeingsaved: 最佳答案 使用:url选项。=form_for@job,:url=>company_path,:html=>{:method=>:post/:put} 关于ruby-on-rails-rails:Howtomak

  4. ruby - 触发器 ruby​​ 中 3 点范围运算符和 2 点范围运算符的区别 - 2

    请帮助我理解范围运算符...和..之间的区别,作为Ruby中使用的“触发器”。这是PragmaticProgrammersguidetoRuby中的一个示例:a=(11..20).collect{|i|(i%4==0)..(i%3==0)?i:nil}返回:[nil,12,nil,nil,nil,16,17,18,nil,20]还有:a=(11..20).collect{|i|(i%4==0)...(i%3==0)?i:nil}返回:[nil,12,13,14,15,16,17,18,nil,20] 最佳答案 触发器(又名f/f)是

  5. ruby - 有人可以帮助解释类创建的 post_initialize 回调吗 (Sandi Metz) - 2

    我正在阅读SandiMetz的POODR,并且遇到了一个我不太了解的编码原则。这是代码:classBicycleattr_reader:size,:chain,:tire_sizedefinitialize(args={})@size=args[:size]||1@chain=args[:chain]||2@tire_size=args[:tire_size]||3post_initialize(args)endendclassMountainBike此代码将为其各自的属性输出1,2,3,4,5。我不明白的是查找方法。当一辆山地自行车被实例化时,因为它没有自己的initialize方法

  6. ruby-on-rails - `a ||= b` 和 `a = b if a.nil 之间的区别? - 2

    我正在检查一个Rails项目。在ERubyHTML模板页面上,我看到了这样几行:我不明白为什么不这样写:在这种情况下,||=和ifnil?有什么区别? 最佳答案 在这种特殊情况下没有区别,但可能是出于习惯。每当我看到nil?被使用时,它几乎总是使用不当。在Ruby中,很少有东西在逻辑上是假的,只有文字false和nil是。这意味着像if(!x.nil?)这样的代码几乎总是更好地表示为if(x)除非期望x可能是文字false。我会将其切换为||=false,因为它具有相同的结果,但这在很大程度上取决于偏好。唯一的缺点是赋值会在每次运行

  7. ruby - 用 Ruby 编写一个简单的网络服务器 - 2

    我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b

  8. ruby - 这两个 Ruby 类初始化定义有什么区别? - 2

    我正在阅读一本关于Ruby的书,作者在编写类初始化定义时使用的形式与他在本书前几节中使用的形式略有不同。它看起来像这样:classTicketattr_accessor:venue,:datedefinitialize(venue,date)self.venue=venueself.date=dateendend在本书的前几节中,它的定义如下:classTicketattr_accessor:venue,:datedefinitialize(venue,date)@venue=venue@date=dateendend在第一个示例中使用setter方法与在第二个示例中使用实例变量之间是

  9. jquery - 我的 jquery AJAX POST 请求无需发送 Authenticity Token (Rails) - 2

    rails中是否有任何规定允许站点的所有AJAXPOST请求在没有authenticity_token的情况下通过?我有一个调用Controller方法的JqueryPOSTajax调用,但我没有在其中放置任何真实性代码,但调用成功。我的ApplicationController确实有'request_forgery_protection'并且我已经改变了config.action_controller.consider_all_requests_local在我的environments/development.rb中为false我还搜索了我的代码以确保我没有重载ajaxSend来发送

  10. ruby - 我如何添加二进制数据来遏制 POST - 2

    我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_

随机推荐