GET与POST请求之区别

不再以讹传讹,GET和POST的真正区别

浅谈HTTP中Get与Post的区别

上面的两个参考文档是同行朋友在问完我GET与POST区别之后发给我的,看完之后一头雾水,原本以为很简单的问题,一下子有点丈二和尚摸不着头脑了。于是乎我就开始查找资料,发现了一个很好的国外网站,专门做对比,名叫 Diffen
再输入GET和POST之后,答案就出来了,下面我就简单翻译一下。

img

HTTP POST请求在从客户端发送到服务端时需要在消息体中提供额外的数据。相反的是,GET请求的所有需要的数据都在URL中。HTML表单可以在<form>元素中指定使用POST方法还是GET方法。指定的方法明确了表单数据是如何被提交到服务器的。如果是GET请求,所有表单数据会被编码进URL,作为查询字符参数拼接。通过POST请求,表单数据将出现在HTTP请求的消息体中。

对比表如下

GET (HTTP) POST (HTTP)
历史记录 参数被保存在浏览器的历史记录里面,以为这是URL的一部分 参数不会被保存在浏览器的历史记录中
收藏 可以被收藏 不可被收藏
返回/重复提交 GET请求可以被重复执行,但是如果该HTML已经存在在浏览器的缓存中将不会被重复提交 浏览器通常会提示用户数据需要被重新提交
编码类型(ENCTYPE属性) application/x-www-form-urlencoded multipart/form-data 或者 application/x-www-form-urlencoded 给二进制数据使用多样编码方式
参数 可以发送,但是放进请求行的参数数据大小将要被限制。最安全的大小是小于2K,某些服务器可以处理到64K 可以发送参数,包括上传至服务器的文件
攻击 容易被脚本程序攻击 比较难以攻击
表单数据类型限制 只允许ASCII字符 没有限制,二进制数据也可以
安全性 安全性低于POST,因为URL中包含了发送的数据,所以会被以明文的形式保存在浏览器的记录和服务器的日志中 比GET安全一些,因为不会被存储
表单数据长度限制 一个安全的URL长度通常限制在2048个字符,但是也视不同浏览器和服务器而不同 没有限制
可用性 GET请求不该被用在发送密码和其他一些敏感信息的时候 POST请求通常用在发送密码和一些敏感信息的时候
可见性 对任何人可见(会被展示在浏览器的地址栏)还有对发送的信息量有一点限制 POST请求在URL中不可见
缓存 可以被缓存 不做缓存

img

在服务端处理的差异

原则上,对一个提交的表单数据处理需要依赖发送的方式,是GET还是POST。由于数据以不同方式进行编码,所以就需要不同的解码机制。因此,一般而言,处理提交时,改变发送方式也需要对脚本做必要的改变。比如,在使用CGI接口时,如果使用GET请求,脚本就会以环境变量(QUERYSTRING)接受数据。但是如果使用POST请求,表单数据就会通过标准输入流(stdin)传递,并且可读字节数将以Content-length头给出。

推荐用法

提交“幂等”表单(那些不“显著改变世界状态”的)时,建议使用GET。换句话说,只涉及查询数据库的表单。另一个观点是,几个幂查询将具有作为一个单一的查询相同的效果。如果数据库更新或其他操作,如触发邮件都参与其中,建议POST的用法。

来自Dropbox开发者博客中的一段话

浏览器并不知道一个特定的HTML表单是做什么的,但是如果是通过HTTP GET方式提交的,浏览器就会在发生网络错误的时候知道自动重复提交时安全的。如果是通过HTTP POST提交的表单,重复提交可能是不安全的,所以浏览器需要先询问用户。

如果转载请标明出处,谢谢!