概述
GET请求在URL中传送的参数是有长度限制的,而POST没有。
GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。而POST数据不会显示在URL中。是放在Request body中。
对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
GET请求参数会被完整保留在浏览器历史记录里;相反,POST请求参数也不会被浏览器保留。
GET请求只能进行url编码( application/x-www-form-urlencoded),而POST支持多种编码方式。
GET请求会被浏览器主动缓存,而POST不会,除非手动设置。
GET在浏览器回退时是无害的,而POST会再次提交请求。
问1
Get请求有Request body么?如果有的话参数可以像Post请求一样放在里面么?
答: HTTP 只是一种协议规范,底层还是TCP/IP。GET和POST能做的事情是一样一样的。你要给GET加上request body,给POST带上url参数,技术上是完全行的通的。但是由于HTTP的规定和浏览器/服务器的限制,导致他们在应用过程中体现出一些不同。
问2
URL中传送参数的长度限制在Get和Post中都是怎么样的呢?
业界不成文的规定是,(大多数)浏览器通常都会限制url长度在2K个字节,而(大多数)服务器最多处理64K大小的url。如果你用GET服务,在request body偷偷藏了数据,不同服务器的处理方式也是不同的,有些服务器会帮你卸货,读出数据,有些服务器直接忽略。所以,虽然GET可以带request body,却不能保证一定能被接收到。
问3
Get、Post请求发送的数据包有什么不同吗?
GET:浏览器会把http header和data一并发送出去,服务器响应200(返回数据);
POST:有可能会先发送请求头,服务端返回 100-continue 然后自己在发送后面的数据包,也有可能会之间将所有的数据都发送过去,这和浏览器的设定有关系。常见的浏览器,内部设定一次POST的数据超过1KB就先只发“请求头”,否则就一次性全发。
问4
转发 和 重定向的区别
转发是服务器行为,重定向是客户端行为。
转发——>客户浏览器发送HTTP请求——>web服务器接受请求——>调用内部一个方法在容器内部完成请求处理和转发动作——>再将转发跳转到的那个网页资源返回给客户; 转发只能在同一个容器内完成 转发的时候浏览器地址是不会变的,在客户浏览器里只会显示第一次进入的那个网址或者路径,客户看不到这个过程,只是得到了想要的目标资源。转发行为浏览器只做了一次请求。(转发只能跳转一次)
重定向——>客户浏览器发送HTTP请求——>web服务器接受请求后发送302状态码以及新的位置给客户浏览器——>客户浏览器发现是302响应,则自动再发送一个新的HTTP请求,请求指向新的地址(302:Found 临时移动,但资源只是临时被移动。即你访问网址A,但是网址A因为服务器端的拦截器或者其他后端代码处理的原因,会被重定向到网址B。)——>服务器根据此请求寻找资源发个客户;再客户浏览器中显示的是重定向之后的路径,客户可以看到地址的变化。重定向行为浏览器做了至少两次请求。(重定向可以跳转多次)
问5
重定向 301 和302 的区别
在客户端是无感的,就是url 变换了下就没了。
301 Moved Permanently 永久重定向。 浏览器会去做一些优化操作。比如更新书签的地址,更新历史记录,下次访问就直接访问新的地址了。爬虫也会去更新自己的数据库。
302 Moved Temporarily 临时重定向。
作者:手辰lz