今天刚学(xiao)了一把GET与POST,在此做个总结,与大家分享。
一.从原理上讲:
1.根据HTTP规范,GET用于信息获取,而且是安全且幂等的。
(1).所谓安全的意味着该操作用于获取信息而非修改信息,不会影响资源的状态。
(2).幂等的意味着对同一URL的多个请求应该返回同样的结果。但在实际应用中,以上2条规定并没有这么严格。引用别人文章的例子:比如,新闻站点的头版不断更新。虽然第二次请求会返回不同的一批新闻,该操作仍然被认为是安全的和幂等的,因为它总是返回当前的新闻。
2.根据HTTP规范,POST表示可能改变服务器上的资源的请求。还是新闻的例子:读者对新闻发表自己的评论应该通过POST实现,因为在评论提交后站点的资源已经不同了,或者说资源已经被修改了。
二.GET和POST的区别:
1.GET的数据会附在URL之后,就是把数据放置在HTTP协议头中。如果数据是英文字母/数字,原样发送,如果是空格,转换为+,如果是中文/其他字符,则直接把字符串用BASE64加密,得出如%E4%BD%A0%E5%A5%BD,其中%XX中的XX为该符号以16进制表示的ASCII,另外GET请求的Content-Type默认是用application/x-www-form-urlencoded方式,无需自行设置。
GET /hello/checkUser.html?username=yyy&age=zzz&verify=%E4%BD%A0%E5%A5%BD HTTP/1.1 Referer: http://localhost:8000/hello/index.html Accept: ** Accept-Language: zh-cn Content-Type: application/x-www-form-urlencoded Accept-Encoding: gzip, deflate Host: localhost:8000 Content-Length: 20 Connection: Keep-Alive Cache-Control: no-cache Cookie: JSESSIONID=BBBA54D519F7A320A54211F0107F5EA6
2.而POST把提交的数据则放置在HTTP包的包体中,在method="POST"的情况下,设置enctype才起作用。 设置enctype标签属性后,在HTTP请求的头部(headers)信息中会多出一行Content-Type信息,并且request-body部分将会以Content-Type指定的MIME进行编码,或者在javascript中设置请求的编码方式也可以。这些操作都是由客户端浏览器自动完成的:如下(application/x-www-form-urlencoded在发送前编码所有字符(默认))
<form action="form_action.asp" enctype="application/x-www-form-urlencoded"
>
三.对网上传言的解释
传言1:GET方式对长度有限制;POST方式对长度没限制。
回答:长度限制之说一方面是HTTP客户端(如IE限定URL长度为2083字节,opera 是4050, Netscape 是8192)的限制;另一方面服务器的实现也加入了限制(如果URL长度过长,HTTP服务器会报414错误)。但HTTP协议及URL官方说明均对长度限制则没有规定。
传言2:GET是从服务器上获取数据;POST是向服务器传送数据。
回答:GET方式就没有向服务器传送数据?那么URL中的?子句送的是什么?不论是GET还是POST,都可以向服务器传送数据,只不过传送数据的位置不同;不论是GET还是POST,都要从服务器上获取数据,否则IE浏览器拿什么东西给我们看呢?关键的问题是 GET的主要任务是获得数据,但在获得数据前也可以向服务器提交一些数据; POST的主要任务是提交数据,但在提交数据之后服务器也会向用户端返回一些显示用的数据。
传言3:GET不安全,用户能从地址栏上看到传送的数据;POST安全,用户不能从地址栏上看到传送的数据。
回答:POST方式看不到传送的数据是因为IE浏览器做了限制。如果你通过第三方工具看到了POST方式传送的数据,你还能说POST方式是安全的吗?理论上说GET和POST方式都不安全,要不就用不着研究HTTPS了。
所以综上几点,总结成下表:
操作方式 | 数据位置 | 明文密文 | 数据安全 | 长度限制 | 应用场景 |
GET | HTTP包头 | 明文 | 不安全 | 看具体浏览器 | 偏向查询数据 |
POST | HTTP正文 | 可明可密 | 相对GET安全 | 看具体浏览器
| 偏向修改数据 |