AJAX将信息添加到URL字符串中

3

我正在使用JSONP进行AJAX调用,但是没有任何报错信息。我们正在观察被调用的服务器上发生了什么,发现AJAX正在向URL添加内容,这可能导致问题。

返回的数据应该是JSON格式的。当从浏览器调用URL时,返回结果如预期。但是,当从页面调用以下代码时,将返回“未定义”的错误,表明没有报告错误。

$.ajax({

    url: 'http://foo:8080/playlist',
    type: 'GET',
    crossDomain: true,
    dataType: 'jsonp',
    jsonp : false,
    success: function(data){

       //Writes return data to UI
        writeToUI(text.html(JSON.stringify(data)));

    },
    error: function(e){

        alert(e.message);
    }

});

观察服务器调用时,我们发现URL变成了“http://foo:8080/playlist?._=1449088167560”。我们认为URL上的额外信息可能会导致API在服务器上失败,但我们想知道这是从哪里来的,并且是否有关闭它的方法?有什么想法吗? Steve
1个回答

5
_=1449088167560是由jQuery生成的,因为您将datatype设置为jsonp。有关更多信息,请参见此处的jQuery.ajax文档。特别注意cache参数描述:

cache(默认值:对于scriptjsonp数据类型为false) 类型:布尔型 如果设置为false,它将强制浏览器不缓存请求的页面。注意:将缓存设置为false仅适用于HEAD和GET请求。它通过将""添加到GET参数来工作。对于其他类型的请求,除了在IE8中将已经通过GET请求过的URL进行POST操作时需要外,不需要该参数。

因为您正在使用jsonp,所以jQuery自动附加此参数以防止Web结果被缓存,而这通常发生在GET请求中。这就是_=1449088167560的来源。我从未在jQuery内部查看过该代码,但我相信它从时间戳(可能是UNIX时间戳值)生成此数字。
至于修复此问题,我想您可以尝试明确设置cache参数为true,如下所示:
$.ajax({
    url: 'http://foo:8080/playlist',
    type: 'GET',
    crossDomain: true,
    dataType: 'jsonp',
    jsonp : false,
    cache: true,
    success: function(data){
       //Writes return data to UI
        writeToUI(text.html(JSON.stringify(data)));
    },
    error: function(e) {
        alert(e.message);
    }
});

这是正常GET请求的默认设置,应该可以防止额外的参数被添加。

另一个需要检查的是你的url中在?_值之间隐藏的明显.值:http://foo:8080/playlist?._=1449088167560。我不确定这是否是你在问题中粘贴时的拼写错误,但它绝对可能导致错误。通常情况下,除非服务器专门寻找键为_的参数,否则在url中添加额外的参数不会有任何影响。然而,使用.,我认为那在技术上是无效的URI字符串。


谢谢。是我的错误。你发现得很好。我尝试添加“cache:true”,但仍然没有返回结果。此时我不确定问题出在哪里。是否有类似JSFiddle的地方可以测试AJAX调用?也许如果有一个可工作的URL来测试,以确保它不是我们的调用中的问题? - SteveV
非常感谢!我已经用window.addEventListener代替了ajax ready。问题解决了! - Sergio Abreu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接