网络请求中GET和POST的区别

get和post是HTTP与服务器交互的方式,URL全称是资源描述符,我们可以这样认为:一个URL地址,它用于描述一个网络上的资源,其实总共有四种:put,delete,post,get。它们的作用分别是对服务器资源的增、删、改、查。所以,get是获取数据,post是修改数据。但是现在只用一个方式就可以做增删改查的操作。

get post
用途 从服务器上获取数据信息 用于修改服务器上的资源的请求,向服务器传送数据
本质 发送请求和接收结果
浏览器请求后退/刷新无害, 后退/刷新则会导致重新提交数据,会再次提交请求。
书签可被收藏,产生的URL地址可以被Bookmark 书签不可收藏
缓存 能被缓存,请求会被浏览器主动cache 请求不能被缓存,  无法使用缓存文件(更新服务器上的文件或数据库),除非手动设置
编码类型 application/x-www-form-url 常见encodedapplication/x-www-form-urlencoded或multipart/form-data
历史参数 保留在浏览器历史中,请求参数会被完整保留在浏览器历史记录里 参数不会保存在浏览器历史中,不会被保留
地址 通过我们自己做的网站也是可以追踪到,GET提交的数据,用户名和密码将会明文出现在URL上,这样就给一些人一个机会,当别人拿到你的账号和密码之后后果不堪设想,把参数包含在URL中 通过request body传递参数
发送格式     get把请求的数据放在url上,即HTTP协议头上,其格式为:
    以?分割URL和传输数据,参数之间以&相连。
    数据如果是英文字母/数字,原样发送,
    如果是空格,转换为+,
    如果是中文/其他字符,则直接把字符串用BASE64加密,及“%”加上“字符串的16进制ASCII码”。
    post把数据放在HTTP的包体内(requrest body)
get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。因为get设计成传输小数据,而且最好是不修改服务器的数据,所以浏览器一般都在地址栏里面可以看到。 post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。post一般都用来传递大数据,或比较隐私的数据,所以在地址栏看不到,能不能看到不是协议规定,是浏览器规定的。
TCP包 产生一个TCP数据包,浏览器会把http header和data一并发送出去,服务器响应200(返回数据); 产生两个TCP数据包,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。
数据长度 有限制(url限制2k=2048个字符)(原则上url长度无限制,那么get提交的数据也没有限制咯?限制实际上取决于浏览器,(大多数)浏览器通常都会限制url长度在2K个字节,即使(大多数)服务器最多处理64K大小的url。也没有卵用。 post理论上无限制。理论上,IIS4中最大量为80KB,IIS5中为100KB(只不过要修改form里面的那个type参数)
只允许ASCII字符的参数的数据类型,只能进行url编码 没有限制,也允许二进制数据,发送包含未知字符的用户输入时,POST 比 GET 更稳定也更可靠,而POST支持多种编码方式
被强制服务器支持
• 浏览器对URL的长度有限制,所以GET请求不能代替POST请求发送大量数据
• GET请求发送数据更小
服务器端用Request.QueryString获取变量的值 服务器端用Request.Form获取提交的数据
安全性 请求是不安全的,

所谓安全的意味着该操作用于获取信息而非修改信息。换句话说,GET 请求一般不应产生副作用。就是说,它仅仅是获取资源信息,就像数据库查询一样,不会修改,增加数据,不会影响资源的状态。

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

相对安全(如果没有加密,他们安全级别都是一样的,随便一个监听器都可以把所有的数据监听到。)
幂等性 幂等(意味着对同一URL的多个请求应该返回同样的结果)
效率

如图1,网络世界中,TCP就像汽车,使用TCP来运输数据非常可靠,几乎不会发生丢件少件的现象。但是如果路上跑的全是看起来一模一样的汽车,那将会引起混乱,送急件的汽车可能被前面满载货物的汽车堵在路上,造成整个交通系统瘫痪。为了避免这种情况发生,交通规则HTTP诞生了。HTTP给汽车运输规定了好几种运输服务类型(车型),有GET, POST, PUT, DELETE等等,当执行GET请求的时候,要选择GET的车型(设置method为GET),即平板车型,这样就可以把传送的数据放在开放式车厢(url)中以方便记录。如果是POST请求,就要选择POST的车型,并把货物放在封闭式车厢里。当然,你也可以在GET的时候将货物包裹起来不让被人看到;也可以在POST的时候在车顶上也放一些数据,让人觉得傻乎乎的。HTTP相当于运输服务订单,规定了运输服务的输入输出,只是一个行为准则,而TCP才是GET和POST怎么实现的根本。HTTP对GET和POST参数的传送渠道(url还是requrest body)提出了要求。“标准答案”里关于参数大小的限制又是从哪来的呢?网络世界中,还有另一个重要的角色:运输公司。不同的浏览器(发起http请求)和服务器(接受http请求)就是不同的运输公司。虽然理论上,你可以在车顶上无限堆货物(url中无限加参数)。但运输公司需要通过调整装货和卸货量来控制成本和降低风险,方式就是限制单次运输量,数据量太大对浏览器和服务器都是很大负担。

关于数据传输量的规定,有一种说法是大多数浏览器通常都会限制url长度在2000Bytes,而大多数服务器最多处理64000大小的url。超过的数据部分不处理。如果你用GET服务,在request body偷偷藏了数据,不同服务器的处理方式也是不同的,有些服务器会帮你卸货,读出数据,有些服务器直接忽略,所以,虽然GET可以带request body,也不能保证一定能被接收到。GET和POST本质上就是TCP链接,并无差别。但是由于HTTP的规定和浏览器/服务器的限制,导致它们在应用过程中体现出一些不同。


GET和POST还有一个重要区别:GET产生一个TCP数据包;POST产生两个TCP数据包。具体来说,对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。也就是说,GET只需要汽车跑一趟就把货送到了,而POST得跑两趟,第一趟,先派一辆空车去和服务器打个招呼“嗨,我们有个订单等下要送一批货来,你们准备好了吗”,服务器响应“准备好了”,然后第二辆汽车才将真正的货物运送。因为POST需要两步,时间上消耗的要多一点,看起来GET比POST更有效。因此Yahoo团队有推荐用GET替换POST来优化网站性能。但这可能是一个坑,需谨慎使用,原因如下:

1. GET与POST都有自己的语义,不能随便混用。

2. 据研究,在网络环境好的情况下,发一次包的时间和发两次包的时间差别基本可以忽略。而在网络环境差的情况下,两次包的TCP在验证数据包完整性上,有非常大的优点。

3. 并不是所有浏览器都会在POST中发送两次包,Firefox就只发送一次。

参考资料链接:

GET和POST两种基本请求方法的区别 - 不断努力的青春 - 博客园


 

猜你喜欢

转载自blog.csdn.net/m0_51660523/article/details/121757270