post 相比get 有很多优点,为什么现在的HTTP通信中大多数请求还是使用get?

好吧, 除了哲学方式的回答以外,下面是一个浏览器从业人员的看法

事实上GET 和 POST 在实践上面有非常大的区别,这两种方法在语义上面并非能互相取代。

POST 是否比 GET 安全

是的, POST要比GET安全一点点,注意,是一点点。。。

说这两者都是明文传送当然是没有错的了,但是这里有一个细节,就是GET的URL会被放在浏览器历史和WEB 服务器日志里面。

POST 发完基本就木有了。。

所以如果你把关键数据放在GET里面,被人偷窥了浏览器,或者WEB服务器被入侵日志被人倒去了,基本泄露可能性100%。而POST来说,日志没有记录,只要数据库服务器不被入侵,基本还是安全的。

当然如果被抓了包,这一切都没有什么卵用,所以,HTTPS该用还是得用。

GET 相对 POST 的优势是什么

最大的优势是, GET 的URL可以人肉手输啊。。。你在地址栏打个POST给我看看。本质上面, GET 的所有信息都在URL, 所以很方便的记录下来重复使用。

所以如果你希望
- 请求中的URL可以被手动输入
- 请求中的URL可以被存在书签里,或者历史里,或者快速拨号里面,或者分享给别人。
- 请求中的URL是可以被搜索引擎收录的。
- 带云压缩的浏览器,比如Opera mini/Turbo 2, 只有GET才能在服务器端被预取的。
- 请求中的URL可以被缓存。

请使用GET.

大家有没有注意到,其实这里面很多方面的要求是和网站的运营相关的,而不是技术相关的。任何的技术行为中,其实多多少少都能看到商业的影子。

反之,就用POST. 特别是有一些东西你是不想让人家可以在浏览器地址栏里面可以输入的。比如,如果你设计一个blog系统, 设计这样一个URL来删掉所有帖子。

http://myblog.com/?action=delete_all

我只能说很快你就知道什么叫不作死就不会死这个道理了,搜索引擎的爬虫分分钟教你做人。

另外一个准则是,可以重复的交互,比如取个数据,跳个页面, 用GET.
不可以重复的操作, 比如创建一个条目/修改一条记录, 用POST, 因为POST不能被缓存,所以浏览器不会多次提交。

WEB API 的设计相对于网页来说更加复杂,同时也有GET/POST的问题,目前主流接受的方法是RESTful, 参见这里

Representational state transfer

这个是趋势:


同时对于何时用GET, W3C 也有一篇文章专门解释:
http://www.w3.org/2001/tag/doc/whenToUseGet.html

摘一点出来:

1.3 Quick Checklist for Choosing HTTP GET or POST

  • Use GET if:

    • The interaction is more like a question (i.e., it is a safe operation such as a query, read operation, or lookup).

and

  • Use POST if:

    • The interaction is more like an order, or
    • The interaction changes the state of the resource in a way that the user would perceive (e.g., a subscription to a service), or o The user be held accountable for the results of the interaction.

However, before the final decision to use HTTP GET or POST, please also consider considerations for sensitive data and practical considerations.

************************************************************************************************************************************

因为它们表达的语义不一样,这决定了主干网络可以对其做不同的处理。

get表达的是一种幂等的,只读的,纯粹的操作,即它除了返回结果不应该会产生其它副作用(如写数据库),因此绝大部分get请求(通常超过90%)都直接被CDN缓存了,这能大大减少web服务器的负担。

而post所表达的语义是非幂等的,有副作用的操作,所以必须交由web服务器处理。

把所有get请求换成post,意味着主干网络上的所有CDN都废掉了,web服务器要处理的请求数量将成百上千倍地增加,显然这不是一个聪明的做法!

-------------------------绕圈子的分割线-----------------------

我觉得对于一个真诚地讨论问题的人来说,以上解释就足够了,然而有些人非要把圈子绕大,那我就陪你们把圈子绕完咯

“get和post就是那几个字母的区别”

开发过web服务器的同学都知道,只要请求打到了服务器上,那么要怎么解释这个请求的内容就完全是服务器自己的事情了,只是web服务器开发框架通常会自动帮你做一些解析http请求的事情而已。

所以如果说客户端和服务端都是自己写,那当然很随意,想怎么玩就怎么玩好了,事实上在没有RESTful建议的时候,大家也的确玩得很随意。

然而说出“就是几个字母的区别”这种话仅仅是表达了“我搞过服务端开发”这层意思而已。

实际上问题真正困难的地方在于,网络上每天产生的请求数目庞大,并且其中绝大部分请求均为只读请求,如果所有这些请求都要交由web服务器直接处理,这无疑是巨大的资源浪费。所以大家自然能想到,假如我们能在请求到达web服务器之前,就对请求作一个初步的解析,得知请求的大致意图,对于不同意图的请求以不同方式满足(比如请求经过nginx的时候nginx就会解析请求头信息,然后根据这些信息把请求分配给合适的角色去进一步处理),那么事情就合理多了。

于是RESTful的建议就在这个时候应运而生了,它的出现正是为了解决http基础设施未能得到充分合理利用的问题。

所以我们开发一个服务的时候,选择http协议(而不是直接用tcp),最根本的原因是,我们希望它可以直接和浏览器打交道,可以借用现有的http基础设施,它的行为能被除自己的客户端以外的,网络中的其它角色所理解。 (而不是仅仅靠http解决文本编码问题

这才是我们之所以强调get和post区别,强调“语义”的真正原因。

references:

http://www.zhihu.com/question/31640769

时间: 2024-12-17 15:57:54

post 相比get 有很多优点,为什么现在的HTTP通信中大多数请求还是使用get?的相关文章

C++ 语言中的重载、内联、缺省参数、隐式转换等机制展现了很多优点

C++ 语言中的重载.内联.缺省参数.隐式转换等机制展现了很多优点,但是这些 优点的背后都隐藏着一些隐患.正如人们的饮食,少食和暴食都不可取,应当恰到好处. 我们要辨证地看待 C++的新机制,应该恰如其分地使用它们. 虽然这会使我们编程时多 费一些心思,少了一些痛快,但这才是编程的艺术. 1 #include <iostream> 2 3 /* run this program using the console pauser or add your own getch, system(&qu

db4o这个对象数据库有很多优点,但为什么不是很火? 大家有没有用过db4o的?

没有主键的概念(因为对象的内存地址,或者引用就能标志一个对象了).因而外界想指向一个具体的对象就比较困难(比如本页的url里的1079505). 激活/保存层次的问题.获取一个对象,它的字段引用了其它对象,那么到底激活多少层次合适?保存时也是如此.层次深了伤性能,层次浅了用着不方便(动不动就是Null reference). 对象引用问题.RDBMS里我们能很轻易地明白一个引用指向的是对象的浅拷贝(因为只引用了一个主键).而一旦与内存中的对象勾搭起来,那深拷贝和浅拷贝就不容易区分了,很难说清我删

C语言:const相比define有何优点

程序员面试宝典中的叙述: 1,const 进行类型检查 2.  const支持一些编译器的断点调试 (以上两点#define都不具有) 网友补充 编译器检查类型,避免宏替换错误,如 #define t 1+1    t = t * 2; 你的答案应该是4, 但程序会输出3, 因为 1+1*2 = 3, 但是如果你用const 就不会出现这种问题.而且编译器会在优化阶段就帮你做完了这个计算,在一定程度上提升了运行的效率. 补充一下~const定义的量具有具体的数据类型,而#define没有. co

Linux面试题目(一)

第一次发帖,整理了一下Linux题目,答案不是标准的,欢迎讨论,进入各自理想的公司! 1.简述Apache两种工作模式,以及它们之间的区别.答:(1)prefork MPM使用多个子进程,每个子进程只有一个线程来处理一个http请求,直到这个TCP连接被释放.root主进程在最初建立startserver个子进程后,等待1秒钟,创建2个进程,再等待1秒钟,再创建4个进程,直到满足最小空闲进程的数量,这就是预派生的由来.这种模式可以不必在请求到来时再产生新的进程,从而提高了访问效率. (2)wor

从eclipse到android studio

本文主要讲解安卓工程从eclipse导出到android studio,下面简称studio,并且兼容两种环境. android studio是谷歌官方推的安卓开发IDE,和eclipse相比,有很多优点,比如: 日志更人性,有各种标记,URL可以直接点击,可以直接选中复制.eclipse的复制则比较麻烦,偶尔会乱滚动,bug较多 studio可以使用网络路径依赖支持的JAR,结构更清晰.eclipse会遇到这样的问题:"引用的两个库都有自己的support-v4.jar,需要统一版本去重&qu

突袭HTML5之SVG 2D入门1 - SVG综述////////////////zzzzzzzz

突袭HTML5之SVG 2D入门1 - SVG综述 SVG可缩放矢量图形(Scalable Vector Graphics)是基于可扩展标记语言(XML),用于描述二维矢量图形的一种图形格式.SVG是W3C制定的一种新的二维矢量图形格式,也是规范中的网络矢量图形标准.SVG严格遵从XML语法,并用文本格式的描述性语言来描述图像内容,因此是一种和图像分辨率无关的矢量图形格式. 什么是SVG? SVG 指可伸缩矢量图形 (Scalable Vector Graphics) SVG 用来定义用于网络的

Linux系统资料

Linux的心得: 1)Linux由众多微内核组成,其源代码完全开源: 2)Linux继承了Unix的特性,具有非常强大的网络功能,其支持所有的因特网协议,包括TCP/IPv4. TCP/IPv6和链路层拓扑程序等,且可以利用Unix的网络特性开发出新的协议栈: 3)Linux系统工具链完整,简单操作就可以配置出合适的开发环境,可以简化开发过程,减少开发中仿真工具的障碍,使系统具有较强的移植性. Linux的发展史: Linux操作系统的诞生.发展和成长过程始终依赖着五个重要支柱:Unix操作系

mongodb与mysql相比的优缺点

与关系型数据库相比,MongoDB的优点:①弱一致性(最终一致),更能保证用户的访问速度:举例来说,在传统的关系型数据库中,一个COUNT类型的操作会锁定数据集,这样可以保证得到“当前”情况下的精确值.这在某些情况下,例 如通过ATM查看账户信息的时候很重要,但对于Wordnik来说,数据是不断更新和增长的,这种“精确”的保证几乎没有任何意义,反而会产生很大的延 迟.他们需要的是一个“大约”的数字以及更快的处理速度. 但某些情况下MongoDB会锁住数据库.如果此时正有数百个请求,则它们会堆积起

nginx的优点

Linux.MySQL.PHP这些框架的优点之前已经介绍过,LNMP和LAMP不同的一点就是Web服务器Nginx,那么Nginx相比Apache有什么优点呢? Nginx是一个小巧而高效的Linux下的Web服务器软件,已在一些大型网站上运行多年,很多国内外的门户网站.行业网站也都在是使用Nginx,相当的稳定. Nginx的主要特点是稳定.功能丰富.安装配置简单.低系统资源.Nginx对于反向代理和负载均衡有不错的支持.Nginx不仅仅可以做为Web服务器,还可以做负载均衡服务器.代理服务器