AJAX 添加到 URL 字符串

Ste*_*veV 3 ajax jquery json jsonp

我正在使用 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);
    }

});
Run Code Online (Sandbox Code Playgroud)

当观察服务器被调用时,我们看到 URL 现在是“ http://foo:8080/playlist?._=1449088167560 ”。

我们认为 URL 上的额外信息可能会导致 API 在服务器上失败,但想看看这是从哪里来的,以及是否有办法将其关闭?

有想法吗?

史蒂夫

War*_*0ck 5

来自_=1449088167560jQuery,因为您指定了datatypeas jsonp。请参阅此处的jQuery.ajax文档以获取更多信息。具体看cache参数说明:

缓存(默认值true, false for dataType 'script' and 'jsonp':) 类型:Boolean 如果设置为 false,将强制浏览器不缓存请求的页面。注意:将缓存设置为 false 只能正确处理 HEAD 和 GET 请求。它的工作原理是将“_={timestamp}”附加到 GET 参数。其他类型的请求不需要该参数,但在 IE8 中,当对已通过 GET 请求的 URL 进行 POST 时除外。

因为您使用的是jsonpjQuery,所以会自动附加此参数以防止 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);
    }
});
Run Code Online (Sandbox Code Playgroud)

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

另一件需要检查的事情是隐藏在您的网址中的和值.之间的表观值: http://foo:8080/playlist?._=1449088167560。我不确定这是否是您将其粘贴到问题中时的拼写错误,但它肯定可能导致您的错误。通常,除非服务器专门寻找关键是 的参数,否则 url 中包含额外的参数应该没有什么区别。然而,我认为这在技术上是一个无效的 URI 字符串。?__.