post get

post方式相比get安全,携带数据更大,我准备所有数据都用post方式获取,这样好吗?

3标记

如题,准备spa[single page application]化, 全站的数据都用ajax调用, 然后全部用post方式提交/获取数据,这样做有什么不好吗?

链接
5天前更新
  • 2
    Zoom.Quiet · 1天前

    实话,没有什么不好,只要你坚持,,,然后遇到复杂情况,或是自个儿手误将整个数据库删除时,才能知道为毛 RESTful 会这么蛋疼的区分5~6种情况要求不同的请求操作,,,

  • 1
    Leedy · 23小时前

    RESTful 目前来看还是非常合理的

  • 1
    精英王子 · 4天前

    POST所谓的安全就是可以防CSRF, 至于传输安全,还是要靠https

  • 添加评论

6 个回答

3
采纳

1、多数浏览器对于POST采用两阶段发送数据的,先发送请求头,再发送请求体,即使参数再少再短,也会被分成两个步骤来发送(相对于GET),也就是第一步发送header数据,第二步再发送body部分。HTTP是应用层的协议,而在传输层有些情况TCP会出现两次连结的过程,HTTP协议本身不保存状态信息,一次请求一次响应。对于TCP而言,通信次数越多反而靠性越低,能在一次连结中传输完需要的消息是最可靠的,尽量使用GET请求来减少网络耗时。如果通信时间增加,这段时间客户端与服务器端一直保持连接状态,在服务器侧负载可能会增加,可靠性会下降。
2、GET请求能够被cache,GET请求能够被保存在浏览器的浏览历史里面(密码等重要数据GET提交,别人查看历史记录,就可以直接看到这些私密数据)POST不进行缓存。
3、GET参数是带在URL后面,传统IE中URL的最大可用长度为2048字符,其他浏览器对URL长度限制实现上有所不同。POST请求无长度限制(目前理论上是这样的)。
4、GET提交的数据大小,不同浏览器的限制不同,一般在2k-8K之间,POST提交数据比较大,大小靠服务器的设定值限制。
5、全部用POST不是十分合理,最好先把请求按功能和场景分下类,对数据请求频繁,数据不敏感且数据量在普通浏览器最小限定的2k范围内,这样的情况使用GET。其他地方使用POST。

链接
6小时前更新
  • 1
    南山磨刀 · 16小时前回复依云:

    这个问题我还是希望深入讨论下 我认为你说的应该是在理论上HTTP请求最多需要建立一次TCP连接,如果第一次TCP连接后,由于网络问题中断或其他原因,我认为浏览器厂商会重新建立连接(这只是我的猜想)或在者同源策略的影响重新建立连接?我刚才在IE下用Wireshark观察了些网站,发现有时候出现两个TCP连接。 刚才又查询了下RCF 确实只能建立不超过2个TCP,连接以避免拥塞 http://www.w3.org/Protocols/rfc2616/rfc2616-sec8.html Clients that use persistent connections SHOULD limit the number of simultaneous connections that they maintain to a given server. A single-user client SHOULD NOT maintain more than 2 connections with any server or proxy. A proxy SHOULD use up to 2*N connections to another server or proxy, where N is the number of simultaneously active users. These guidelines are intended to improve HTTP response times and avoid congestion. 还有IE文档 http://support.microsoft.com/kb/183110/en-us MaxConnectionsPerServer REG_DWORD (Default 2) Sets the number of simultaneous requests to a single HTTP 1.1 Server MaxConnectionsPer1_0Server REG_DWORD (Default 4) Sets the number of simultaneous requests to a single HTTP 1.0 Server 1.1协议2个,1.0协议4个 对于我们使用最多的IE,有这样一个注册表设置: HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings 。 在我印象中(描述不完全正确)。浏览器在网络延迟、丢包,服务端响应时间太长的情况下,客户端重发POST的数据到服务器。如果浏览器有一次传输中只收到HTTP的Header,但Body没有接受到,服务端发送请求错误码后才知道客户端没有重新POST。浏览器与服务器之间的协调是什么样的?这个过程能描述么?是连结超时,再等它重发数据,再超时,再重发么?那和WEB服务侧定义的“超时”如何协调呢?

  • 1
    依云 · 17小时前回复南山磨刀:

    还是错了。任何方法(method)的 HTTP 请求最多需要建立一次 TCP 连接,而且,除非升级(upgrade)到其它协议(比如 WebSocket),都是先由客户端发送完请求再接收响应的。POST 在传输数据上和 GET 唯一的不同是数据的组织形式。如果使用 keep alive 技术的话,一个 TCP 连接可以进行多个 HTTP 请求。

  • 1
    南山磨刀 · 18小时前回复依云:

    感谢批评指正,我描述不正确,对与RFC没有进行核实。 http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.2 The HTTP protocol does not place any a priori limit on the length of a URI.

  • 更多评论 (5条)
12

post方式相比get安全

你从哪个学校的哪个老师那里学到的这个理论?

携带数据更大

这个是对的,POST 携带数据大,而且,不仅仅是大,某些数据只能用 POST 方法「携带」,比如 file。

我准备所有数据都用post方式获取,这样好吗?

GET 的本质是「得」,而 POST 的本质是「给」。而且,GET 是「等幂」的,在这一点上,GET 被认为是「安全的」。

补充一条:GET 的内容可以被浏览器缓存,而 POST 的数据不可以。

链接
21小时前更新
4

Wikipedia:

GET

Requests a representation of the specified resource. Requests using GET should only retrieve data and should have no other effect. (This is also true of some other HTTP methods.)

POST

Requests that the server accept the entity enclosed in the request as a new subordinate of the web resource identified by the URI. The data POSTed might be, as examples, an annotation for existing resources; a message for a bulletin board, newsgroup, mailing list, or comment thread; a block of data that is the result of submitting a web form to a data-handling process; or an item to add to a database.

所以get主要用来“读取”数据,而“post”主要用于修改、插入数据。

不过就你这个问题来说,用post没有什么不好的。

链接
  • 1
    justjavac · 21小时前回复tcdona:

    因为post 是修改,而 get 是读取,所以,post 的内容是不会被缓存的,而 get 可以。 从侧面说明了 get 是安全的。

  • 更多评论 (1条)
3

POST可以防止一些跨站攻击。 比如像

http://www.wooyun.org/bugs/wooyun-2010-016317
http://www.wooyun.org/bugs/wooyun-2010-024150

但是,浏览器完成一个POST请求需要消耗更多的等待和资源。 如果某个请求数据不涉及到业务安全,建议GET完成。而XSS跨站等问题,可以用动态token解决。

链接
4天前更新
1

“滥用”POST不一定妥当:程序overhead会成大问题。

举个例子,我有一个 Objective-C CGI 库,如果 CGI 环境变量里面没有指定存在 POST 数据,库里面就直接把 stdin 关了,而不去等待数据。这样的话效率会高很多,还省内存(不用创建输入数据对象了)!

链接
  • 1
    Maxthon T. Chan · 23小时前回复tcdona:

    你去看看 CGI 的 RFC 你就知道了,可以从环境变量判断有没有上行数据。

  • 1
    Maxthon T. Chan · 23小时前回复Andy:

    overhead 就是额外的资源开销。动作一下读 stdin 有开销的。如果没有要读的数据的话直接把 stdin 关了很省资源的。

  • 1
    Andy · 23小时前

    overhead 这个词怎么理解?类似于将所有的GET,delete, option操作用post重写,可以这么理解么。

  • 更多评论 (1条)
1

其实,亲,post数据是二段提交的!只要你和团队能适应post的各种规则,用吧,这年头乱用方法的人多了去

posted @ 2013-06-19 15:44  tangr206  阅读(342)  评论(0)    收藏  举报