【发布时间】:2013-09-12 10:56:56
【问题描述】:
在 Andriod 中从 webview 向跨域网站执行从 javascript 到跨域网站的同步 ajax 请求 (GET) 时,请求失败。 代码如下,
var jqxhr = $.ajax({
url: url,
cache: false,
dataType: 'json',
type: 'GET',
async: false
})
.done(function ( data ) { fnSuccess(JSON.stringify(data)); });
jqxhr.fail(function(jqXHR, textStatus, errorThrown) {
alert("Failed with:"+textStatus+"--"+errorThrown+"--"+jqXHR.status+"--"+jqXHR.responseText);
});
网站应该以 JSON 格式向我返回数据,平均响应时间约为 90 秒。 网址是https://abc.com/abc/123?a=1&b=2&c=3
Ajax 请求启动时显示以下日志(adb logcat), E/WebUrlLoaderClient(924):第0次尝试10秒后同步请求超时,URL:https://abc.com/abc/123?a=1&b=2&c=3 E/WebUrlLoaderClient(924):第一次尝试10秒后同步请求超时,URL:... E/WebUrlLoaderClient(924):第二次尝试10秒后同步请求超时,URL:...
记录第 3 行后,ajax 请求将就绪状态更改为 4,响应状态更改为 0 而不是 200,响应文本也为空。这意味着它在 30 秒后超时(3 次重试,每次 10 秒)。
我浏览了Android开源的WebUrlLoaderClient.cpp,发现超时和重试次数分别固定为10和3。
同样的请求在异步模式下工作正常。
请让我知道我是否在此代码中做错了什么,或者是否有任何其他方法可以执行响应时间超过 30 秒的同步 ajax 调用。
【问题讨论】:
-
例如使用 Postman 请求是否可以正常工作?我认为是这样,因为非异步工作正常。我不知道是什么原因造成的,因为它只需更改标志即可。我不推荐任何同步的东西,任何东西(很少有例外)。只需使用回调并切换异步。
-
Ajax 永远不应该是同步的,为什么你希望它是同步的?顺便说一句,你说不能在 Android 上工作,那么其他设备作为桌面呢?并检查您的控制台是否有错误
-
由于对 url 的请求是跨域请求,因此无法在桌面浏览器上运行(Firefox 和 Chrome 出现错误)。此 Ajax 请求作为应用程序的一部分在 Android 上的 webview 中运行。我没有在 ios 的 webview 上检查这个 Ajax 调用的行为,但是一旦我测试它就会更新。
-
看起来服务器不接受同步请求,jsonp???但是为什么要同步呢?
-
试试这个 super.setIntegerProperty("loadUrlTimeoutValue", 60000);
标签: javascript android jquery ajax webview