注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

一车,一房,一个温暖家

10万左右的车,80平方的房子,这是我奋斗的暖暖的家

 
 
 

日志

 
 

引用 Ajax请求的GET与POST方式比较   

2015-03-31 18:41:04|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

When using the XMLHttpRequest object, the browser implements POST in two steps: (1) send the headers, and (2) send the data. It is better to use GET instead of POST since GET sends the headers and the data together (unless there are many cookies). IE’s maximum URL length is 2 KB, so if you are sending more than this amount of data you may not be able to use GET.

翻译:

当使用XMLHttpRequest对象时,浏览器通过两个步骤实现POST:(1)发送请求头;(2)发送数据。而GET的请求头和数据是一起发送的(除非包含很多cookie),所以使用GET方式更好些。IE支持的最大URL长度是2KB,所以你的数据很长的话就不能用GET了。

这段话蜻蜓点水,只说了GET和POST的这两个差别,而实际使用中会是这么简单吗?

寻根:GET与POST的差别

RFC2616中详细定义和解释了GETPOST,简单来说,GET和POST的根本区别如下:

GET通过URL传递参数(以本文的动态地址 http://www.oncoding.cn/?p=480 为例),同时发送请求头,从服务器取得数据:

GET /?p=480 HTTP/1.1

Host: www.oncoding.cn

Mozilla/5.0

….

POST也需要URL和请求头,同时需要额外发送数据到服务器,然后取得服务器响应,其数据格式如下:

POST /wp-login.php HTTP/1.1

Host: www.oncoding.cn

User-Agent: Mozilla/5.0

….

userid=admin&password=asdfg

GET和POST为什么有速度的差异?

如YSlow所说,POST比GET多出了一个发送数据的步骤,我们可以通过MIDP实现GET和POST的程序代码来理解这一个过程:

01// MIDP实现GET的过程(变量定义省略):
02conn = (HttpConnection) Connector.open( url ); //建立连接
03conn.setRequestProperty( "User-Agent", agent ); //设置请求头
04 
05int rc = conn.getResponseCode(); //取得响应
06// ....
07// MIDP实现POST的过程(encodedData为post数据):
08conn = (HttpConnection) Connector.open( url ); //建立连接
09conn.setRequestMethod( HttpConnection.POST ); //设置请求头
10conn.setRequestProperty( "User-Agent", agent );
11conn.setRequestProperty( "Content-Type", type );
12conn.setRequestProperty( "Content-Length",
13                encodedData.length() );
14 
15OutputStream os = conn.openOutputStream(); //发送数据
16os.write( encodedData.getBytes() );
17 
18int rc = conn.getResponseCode(); //取得响应

以上程序摘自HTTP POST Basics

分析可见,速度的差别确实出在这一个发送数据的环节上,这一环节究竟耗时多少,我们一会儿来测一下。

何时用GET,何时用POST

这个问题不该在我们话题的讨论之列。关于使用场合的差别,无非有两个因素:

1. POST比GET更安全。因为GET数据可以缓存,url可以被人轻松的得到,而Ajax中不存在这个问题;

2. IE支持url最长为2KB,所以参数过长不能用GET,这条是Ajax需要考虑的地方。

究底:Ajax的GET与POST在速度上有多少差别

刚刚有老外写的一篇GET and POST Requests in AJAX,比较GET和POST在Ajax中的速度问题,写的洋洋洒洒,但通篇没有一点数据和理论,各浏览器的测试结果居然只有”Very slow”和”Fast”。。。

我们干脆自己写程序来测试一下,通过发送Ajax请求前和接收到Ajax数据后的时间差,来测试其速度的差异。使用了纯Javascript和jquery两种方式作比较。

测试DEMO在这里 | 下载测试程序包(请根据网速,酌情修改请求时间间隔,否则会引起混乱)

手头的几个浏览器测试了一下,PHP程序放在美国Dreamhost服务器上,通过山东电信网络测试结果如下:

Firefox 3.5

Chrome 4.0.266 Beta

IE8

虚拟机中的IE6:

虚拟机中的Firefox 2.0:

通过对这几个流行的浏览器的测试,发现POST确实比GET要慢,而慢的这个时间基本等于服务器的响应时间(Ping值)。浏览器之间的差距不大,Firefox3.5和Chrome4速度比IE要快一点。通过jQuery进行Ajax调用比纯JavaScript稍快(是jQuery做了优化还是我JS程序写的不好?)。

其他浏览器有时间再测试一下,也欢迎有条件的朋友帮忙测试。

后记

为什么要寻根究底研究这个东西呢?

源于同事开发中遇到的一个问题——使用beforeunload事件,在用户关闭浏览器时通过Ajax向服务器发送数据,使用的POST方式。

在分析数据时,发现有一种情况,得到了请求头信息,却没有得到Ajax数据。虽然这部分数据很少,但引起了我的兴趣,同时把心里一直不明白的这个问题搞清楚了。通过这通分析知,这种情况的原因可能是浏览器在得到服务器响应之前,就关闭了连接,而Ajax的异步调用方式,致使beforeunload不会等待Ajax返回,导致POST数据未能发送。解决方法,可以将数据发送改为同步方式。(这个设想不成立,因为发送请求不是异步的,所以原因可能在别的地方。)

原文:http://www.oncoding.cn/2009/ajax-get-post/comment-page-1/#comment-3445

  评论这张
 
阅读(14)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018