Javascript 使用Internet Explorer时,jQuery JSONP请求经常失败
作为中型web应用程序的一部分,我们在 客户端的浏览器与基于Python的HTTP服务器进行通信 响应JSONP请求。我们注意到客户端代码是随机的 在Internet上运行时无法从服务器接收响应 浏览器9或Internet Explorer 10。随后的测试显示 即使在使用其他主要浏览器时,也会出现这种随机故障 在Microsoft Windows 7上运行,但非常罕见。最后,没有 当客户端浏览器在上运行时,会观察到此类故障 Linux操作系统 系统。 存储库包含客户机和服务器代码的简化版本 这说明了基本问题,并可用于帮助调试 问题其操作总结如下,并附有相关代码 Python HTTP服务器 文件夹Javascript 使用Internet Explorer时,jQuery JSONP请求经常失败,javascript,jquery,python-2.7,jsonp,internet-explorer-10,Javascript,Jquery,Python 2.7,Jsonp,Internet Explorer 10,作为中型web应用程序的一部分,我们在 客户端的浏览器与基于Python的HTTP服务器进行通信 响应JSONP请求。我们注意到客户端代码是随机的 在Internet上运行时无法从服务器接收响应 浏览器9或Internet Explorer 10。随后的测试显示 即使在使用其他主要浏览器时,也会出现这种随机故障 在Microsoft Windows 7上运行,但非常罕见。最后,没有 当客户端浏览器在上运行时,会观察到此类故障 Linux操作系统 系统。 存储库包含客户机和服务器代码的简化版本 这
jsonp_server
包含我们的HTTP的简化版本
名为test\u server.py
的文件中的服务器。它假设所有人都得到了回报
请求是jQuery JSONP请求。它使用回调参数响应JSONP请求,回调参数是一个JavaScript对象,其属性名为result
,其值为
随机设置为true
或false
服务器实现为Python 2.7
BaseHTTPServer.HTTPServer
,带有一个作为
BaseHTTPServer.BaseHTTPRequestHandler
请求处理程序的do\u GET()
方法如下所示:
def do_GET(self):
try:
#
# Send OK and content type.
#
self.send_response( httplib.OK )
self.send_header('Content-Type', 'application/json')
self.end_headers()
#
# Send the JSONP response body.
#
parsed_path = urlparse.urlparse(self.path)
parsed_query = urlparse.parse_qs(parsed_path.query)
callback = parsed_query['callback'][0]
result = random.choice([True, False])
self.wfile.write( "{0}({1})".format( callback,
json.dumps({ 'result' : result })) )
return
except IOError as errorInst:
error_message = 'do_GET(): Internal server error while processing: {0} ({1})'.format(self.path, str(errorInst))
self.send_error( httplib.INTERNAL_SERVER_ERROR, error_message )
return
测试01
下面提供了一个说明问题的简单测试
文件夹test\u 01
。在运行Python HTTP服务器之后,您可以
只需在web浏览器中打开名为test_01.html
的文件即可运行
测试。客户端JavaScript位于名为
test_01.js
。它只需向上的HTTP服务器发送一个JSONP请求
localhost
每秒一次。它会记录请求的数量
已成功和失败的号码。这些数字是
显示在浏览器中。相应的代码如下所示:
$(document).ready(function() {
var test_count = 0 ;
var pass_count = 0 ;
var fail_count = 0 ;
var test_interval_ms = 1000 ;
var get_ajax_obj = function() {
return {
url: "http://localhost:8090/test_request.html",
timeout: 3000,
dataType: 'jsonp',
success: function(data) {
pass_count++ ;
$('#test_result').text(data['result'] ? "True" : "False") ;
$('#pass_count').text(pass_count) ;
run_next_test() ;
},
error: function() {
fail_count++ ;
$('#fail_count').text(fail_count) ;
run_next_test() ;
}
}
} ;
var run_next_test = function() {
setTimeout( function() {
test_count++ ;
$('#test_count').text(test_count) ;
$.ajax(get_ajax_obj());
}, test_interval_ms ) ;
} ;
run_next_test() ;
});
Test01结果
所有测试均在运行64位Windows 7的计算机上执行
最终与服务包1。期间使用了以下浏览器:
测试:
+-------------------------------+-----------------+
| Browser | Version |
+-------------------------------+-----------------+
| Microsoft Internet Explorer | 10.0.9200.16721 |
| Google Chrome | 30.0.1599.101 m |
+-------------------------------+-----------------+
在运行期间的任何给定时间,只有一个浏览器运行客户端代码
这些测试。测试结果如下所示(当然,每次运行的结果各不相同):
如图所示,大量测试在运行Internet时失败
浏览器,而Chrome没有失败
知道为什么会发生这种情况吗?IE可能正在缓存结果。尝试将缓存设置为false
$.ajax({
url: 'http://localhost:8090/test_request.html',
cache: false,
dataType: 'jsonp',
success: function(data) {
console.log('success', data);
},
error: function (request, status, error) {
console.log('error', error);
}
});
尝试将服务器实现为多线程服务器。例如,如果您创建
class ThreadedHTTPServer(ThreadingMixIn, HTTPServer):
pass
测试实现中的问题将消失 从您的
code
中删除console.log
,internetexplorer
@RohanKumar不支持它,因为它是在调试时出现的。将其从上面的列表中删除。它不在原始应用程序代码中。没有它的结果是相同的。jQuery的JSONP请求通过向URL追加查询字符串参数“=[TIMESTAMP]”来禁用缓存,如前所述。所以缓存不是这个问题的根源。为了确保这一点,我们尝试通过禁用每个请求以及所有jQueryAjax调用的缓存。结果是一样的。
class ThreadedHTTPServer(ThreadingMixIn, HTTPServer):
pass