用 jQuery 的 AJAX 功能发现的一个错误/注意点:HTTP Error 411

今天程序中有个地方需要 Ajax 方式 POST 数据,发现在 IE 6.0 下正常,而 FireFox 2.0.0.9 下则出错。

通过 FireBug 抓取 ajax 回发后得到的页面信息如下:

HTTP Error 411 - Length required

经过 google 搜索发现,这个 HTTP 状态码对应于服务器没有接收到 Content-Lengh 这个 Header 的情况。(我用的服务器是 Apache + mod_python,当然不一定所有 Web 服务器行为都是这样。)

而为什么只有在 Ajax 的情况下有呢?是因为调用了:

xmlHttp.send(null);

发送 null 的时候,服务器就有可能发出以上信息。而按照正常逻辑,不需要发送信息的时候,应该用 GET 方法而不是 POST (在 xmlHttp.open 方法中指定),那样就能解决此问题。
但也可以用:

xmlHttp.send('');

来解决。

因为我调用了 jQuery 的 $.ajax 方法来间接实现的 Ajax 功能,所以,jQuery 中调用 $.ajax 时,无论有没有数据,总是写一个空字符串为数据,就可以避免这种问题了:

$.ajax({
    
"type""POST",
    
"url""/note/ajax_get/?id=" + note.data_id,
    
"dataType""json",
    
"data": '',
    
"success"function(msg){
        saveNoteInfo(id, msg);
        fillImp();
    }
});


至于为什么 IE 可以而 FireFox 则出错,可能是因为 IE 中的 xmlhttp 对象和 FireFox 的 XmlHttpRequest 行为稍有不同造成的。

参考:
http://www.checkupdown.com/status/E411.html
http://www.modpython.org/pipermail/mod_python/2006-March/020522.html

posted @ 2007-11-22 19:02 木野狐(Neil Chen) 阅读(5841) 评论(19) 编辑 收藏

 回复 引用 查看   
#1楼 2007-11-22 20:19 Jeffrey Zhao      
呵呵,谢谢提醒:)
 回复 引用 查看   
#2楼[楼主] 2007-11-22 21:37 木野狐(Neil Chen)      
@Jeffrey Zhao
偶然发现的问题。呵呵

 回复 引用 查看   
#3楼 2007-11-23 09:01 李华顺      
奇怪了,我怎么从来都没有遇到过,
难到是只是有 type 是 "POST" 的情况下才会有么?

 回复 引用 查看   
#4楼[楼主] 2007-11-23 09:38 木野狐(Neil Chen)      
@李华顺
是的。

 回复 引用 查看   
#5楼 2007-11-23 11:09 Enzo      
o(∩_∩)o... 以后就事先可以注意下
 回复 引用 查看   
#6楼 2007-11-23 11:33 Jeffrey Zhao      
不过估计这点也和应用服务器有关……
 回复 引用 查看   
#7楼[楼主] 2007-11-23 13:43 木野狐(Neil Chen)      
@Jeffrey Zhao
没错,很可能是 mod_python 特有的行为,但不保证其他服务器是否也这样。

 回复 引用 查看   
#8楼 2007-11-24 09:10 天启      
在Jquery中文论坛上说jquery的ajax部分有小bug,在里面争论的很多,也没个结果。博主知道怎么回事吗?
 回复 引用   
#9楼 2007-11-24 11:24 婚纱[未注册用户]
我也没有遇到过哦.
 回复 引用 查看   
#10楼[楼主] 2007-11-25 18:48 木野狐(Neil Chen)      
@天启
能否贴一下那个帖子的地址?

 回复 引用 查看   
#11楼 2007-11-26 09:02 天启      
http://bbs.jquery.org.cn/frame.php?frameon=yes&referer=http%3A//bbs.jquery.org.cn/viewthread.php%3Ftid%3D137%26highlight%3D

这是其中一个帖子。跟帖中有其他的相关讨论。
我的观点倾向于,DOM太复杂导致的浏览器崩溃。

ps:最近看了一篇文章,说ajax的广泛应用导致浏览器崩溃,我想也是,ajax用得太多,(并且有很多不负责的程序员同志写的满是bug的东西)务必使用过多的客户端CPU、内存资源,ajax这东西,好处多,缺点也不少啊,谨慎!

 回复 引用 查看   
#12楼[楼主] 2007-11-26 10:09 木野狐(Neil Chen)      
@天启
我看看去:)
谢谢你的提醒,的确,ajax 滥用了之后,会暴露更多的安全漏洞;而且,ajax 应用太复杂后变得很难调试,浏览器死掉的几率更大了。

 回复 引用 查看   
#13楼[楼主] 2007-11-26 10:17 木野狐(Neil Chen)      
@天启
又仔细看了那个帖子,原因不在 ajax 功能,因为我的代码里也有同时发出几十个 ajax 请求的(是否合理有待优化),没有发现类似的问题。
我看那个问题可能因为,在不同的请求在完成后,操作 DOM 有冲突。

 回复 引用 查看   
#14楼 2007-12-08 18:13 Shing Ye      
我也没遇到过...
 回复 引用 查看   
#15楼 2008-03-19 12:01 普若伽门      
有个问题,就是出错码在哪里查?
 回复 引用 查看   
#16楼[楼主] 2008-03-20 11:12 木野狐(Neil Chen)      
@普若伽门

你指的是哪里的出错码呢?

 回复 引用   
#17楼 2008-04-22 15:28 Sunxc[未注册用户]
您好 最近刚研究下jquery 发现 使用$.ajax 的时候 那个type如果是get 我后面的data参数name=aa&age=12 就无法得到 必须type 是post才可以得到这是为什么呢 我使用prototype 的时候用get就可以
 回复 引用   
#18楼 2009-12-02 18:00 yyyfff43[未注册用户]
多谢博主
 回复 引用 查看   
#19楼[楼主] 2010-06-22 21:00 木野狐(Neil Chen)      
@dff
也可以用什么?呵呵,看不到你冒号下面的代码。