用户
 找回密码
 入住 CI 中国社区
搜索
查看: 9351|回复: 8
收起左侧

get与post的那点破事儿

[复制链接]
发表于 2008-7-13 13:33:57 | 显示全部楼层 |阅读模式
主要是说表象了,底层的就懒得研究,暂时没考虑那么深。



       先说相同点,只有了解了相同点之后才能理解为什么会发生混淆。
       两者都能向服务器发送数据,提交的“内容[注1]的格式相同,都是
var_1=value_1&var_2=value_2&....

       get 和 post 区别如字面,一个是get(获取),一个是post(发送)。

       get用来告诉服务器需要获取哪些内容(uri+query),向静态页面(uri)请求则直接返回文件内容给浏览器,向一个动态页面请求时可以提供查询参数(query)以获得相应内容。

      post用来向服务器提交内容,主要是为了提交,而不是为了请求内容,就是说post的初衷并不要求服务器返回内容[注2],只是提交内容让服务器处理(主要是存储或者处理之后再存储)。

       get和post出现混淆是因为对提交的数据处理方法的滥用造成的,数据是无辜的。

       混淆之一:
       将get提交的用来查询的字段当作是存储数据存入了服务器端文件或者数据库。然后就误以为get是用来提交用于存储的数据的。

      混淆之二:
       编写脚本在服务器端通过处理post提交的数据并返回内容。只要有数据,就能用来进行判断,脚本怎写是程序员的事,而不在乎数据来源的形式(post、get,或者是自己预设值的常量)。这点功能上确实没问题,只是背离的其初始目的而已。

       由于都是要传送数据,且数据格式相同(即使数据格式不同,只要能提取出相应数据)。使用的时候难免出现张冠李戴,将get数据用来存储、将post数据用来检索返回数据。但是二者还是有区别的(主要是根据其用途而“人为”[注3]造成的),get的长度限制在2048字节(由浏览器和服务器限制的,这是目前IE的数据,曾经是1024字节),很大程度上限制了get用来传递“存储数据”的数据的能力,所以还是老老实实用来做检索吧;post则无此限制(只是HTTP协议规范没有进行大小限制,但受限于服务器的处理能力),因此对于大的数据(一般来说需要存储的数据可能会比较大,比2048字节大)的传递有天然的优势,谁让它是 nature born post 呢。

       get提交的数据是放在url里,目的是灵活的向服务其提交检索请求,可以在地址栏随时修改数据以变更需要获取的内容,比如直接修改分页的编号就跳到另外一个分页了(当然也可能是404)。post提交的数据放在http请求的正文里,目的在于提交数据并用于服务器端的存储,而不允许用户过多的更改相应数据(主要是相对于在url修改要麻烦很多,url的修改只要点击地址栏输入字符就可以了),除非是专门跑来编辑数据的。

       花边:post和get的安全性在传输的层面上区别不大,但是采用url提交数据的get方式容易被人肉眼看到,或者出现在历史纪录里,还是可能被肉眼看到,都是一些本地的问题。

       注1:我强调的是内容,至于http协议中的get和post的格式大家有兴趣就自己看看吧。
       注2:get方式主要是为了获得预期内容,即uri+query相同时所得到的内容应该是相同的。而post主要是提交内容,至于是否有必要返回页面可能只是出于用户体验,比如注册时返回你的注册id,但是如果只是返回一个“您已注册成功”的相同页面(即使你post的数据不一样)也没什么好奇怪的。
       注3:关于这个“人为”,不是那么贴切,get和post还是有技术层面的区别的。但是从表象上看暂且这么说吧,毕竟二者的混淆也是“人为”的。。


      PS:Codeigniter中国论坛首发,转载请注明哈~

[ 本帖最后由 cchaha 于 2008-7-13 13:42 编辑 ]

评分

参与人数 1威望 +5 收起 理由
Hex + 5 精品文章+原创内容

查看全部评分

发表于 2008-7-13 13:50:48 | 显示全部楼层
回复支持一下!!!
发表于 2008-7-13 13:51:06 | 显示全部楼层
除了get,post还有put,delete
呵呵
REST,现在最火爆。
所有很有意义,up
发表于 2008-7-16 09:52:09 | 显示全部楼层
唉,我就从没用过get,真的,一直在用post
发表于 2010-8-9 13:36:08 | 显示全部楼层
除了ci的db类中用过get和get_where之外,都是post。
发表于 2010-9-9 23:40:03 | 显示全部楼层
GET通常用于发杂参数查询
POST交一下表单没事。
发表于 2011-10-28 17:18:16 | 显示全部楼层
发表于 2011-12-2 16:52:36 | 显示全部楼层
url传参就是get么。
发表于 2011-12-4 02:46:35 | 显示全部楼层
boshwheel 发表于 2011-12-2 16:52
url传参就是get么。

http://domain.com/xxx?a=b&c=d
这就是 GET 传参。

本版积分规则