【问题标题】:Understanding Cross domain XHR and XML data了解跨域 XHR 和 XML 数据
【发布时间】:2012-12-13 06:29:42
【问题描述】:

我使用 JavaScript 和 AJAX 已经有一段时间了,我想了解 Cross Domain XHR 的真正工作原理以及 JQuery 是如何处理它的,出于某种原因,我从来没有想过它是如何工作的。我已经阅读了Wikipedia JSONP 的文章,我更加困惑。我不确定我不明白什么。

我知道使用 JSONP 我可以直接在 JavaScript 中使用 JSON 数据。例如this JS Fiddle example。这里我使用JSON 来显示图像列表。我可以改用XML 数据来实现同样的目的吗?在回答这部分问题之前,请阅读类比的其余部分。

1) 如果我尝试类似下面的方法或Fiddle link,我会收到错误Uncaught ReferenceError: jsonFlickrFeed is not defined

​$.ajax({
    url: "http://api.flickr.com/services/feeds/photos_public.gne",
    data: {
        format: "json"
    },
    dataType: "jsonp",
    success: function(d) {
        console.log(d);
    }
});​

2) 下面的示例或fiddle link 工作正常

$.ajax({
    url : "http://api.flickr.com/services/feeds/photos_public.gne",
    data: {format: "json"},
    dataType: "jsonp"
});
jsonFlickrFeed = function(d){
    console.log(d);
}

Q) 我想在 1 和 2 之间,因为返回的数据格式类似于 jsonFlickrFeed({}),我们需要编写 jsonFlickrFeed 回调函数才能使其工作?

Q) 为什么它从不调用成功回调?

Q) 是否是 Flickr 端点负责返回 JSONP(我的意思是格式为 jsonFlickrFeed({}) 的数据)?还是它只是返回实际的 JSON 和 JQuery 填充它?

3) 使用$.getJSON,代码如下所示或fiddle

$.getJSON("http://api.flickr.com/services/feeds/photos_public.gne?jsoncallback=?", {
    format: "json"
}, function(d) {
    console.log(d)
});​

Q) 在情况 3) 中,JQuery 如何处理它?我看到返回的数据格式为 jQuery1820349100150866434_1355379638775({}) 所以如果我假设 JQuery 完成了将 JSON 与回调相关联的工作,是否正确?

Q) 由于上述原因,它被称为 JQuery 的速记方法?

无论我尝试什么,我都无法使用 XML 数据。我一直想不出一种使用 XML 数据代替 JSON 的方法。

Q) 是否可以以类似的方式使用 XML 数据而不是 JSON?

Q) 我能想到的唯一方法是通过同一域代理数据。这种理解正确吗?

如果有帮助的话,XML example 我在 Dropbox 上。这是为了证明当XML数据来自同一个域时,它可以被解析。

【问题讨论】:

  • 以上所有问题都有一个简单的答案; JSONP 通过在页面中插入脚本标签来工作,就像任何脚本标签一样,这就是为什么一些常规函数不起作用的原因,因为它不是真正的 XMLHttpRequest。至于以同样的方式获取XML,不,那是不可能的(获取XML当然是可能的,只是与JSONP的方式不同)。
  • 你看过 CORS 吗? en.wikipedia.org/wiki/Cross-origin_resource_sharing 如果您的浏览器要求不是太宽泛 (caniuse.com/cors),那么它是一种更直接的跨域 XHR 方法。
  • @joshuacronemeyer 是的,我有。在大多数情况下它没有帮助。对我来说 JSON 不是问题,它消耗 XML。
  • 我相信@adeneo 回答得当场。

标签: javascript jquery ajax xmlhttprequest


【解决方案1】:

Q) 是否可以以类似的方式使用 XML 数据而不是 JSON?

不,因为 JSONP 不是 json,它是 javascript。客户端需要来自服务器的脚本,该脚本在客户端上执行。 “JSONP”是一种使用脚本标签来获取 javascript 对象的技巧。 您可以在 javascript 对象中以字符串形式发送 XML。

Q) 我能想到的唯一方法是通过同一域代理数据。这种理解正确吗?

或者让服务器支持CORS

http://en.wikipedia.org/wiki/Cross-origin_resource_sharing

我的意思是,如果域默认情况下不允许来自客户端脚本的 X-origin 请求,那么您将无能为力。某些浏览器可能允许这样做,但这不是默认行为。在这种情况下,唯一的选择是同一域上的代理。

【讨论】:

  • 你确实回答了我的问题(为此 +1),但我觉得它不够清晰,所以我没有接受你的回答。
【解决方案2】:

@adeneo 回答了这个问题,但在评论中。所以我对JSONP 的理解从根本上是有缺陷的。当发出 JSONP 请求时,它不是 XHR 请求。相反,需要注意的是动态插入script 标签并获取JSON。因此,即使调用看起来像 XHR(至少 IMO JQuery),它也不是。根本没有使用 XMLHttpRequest 对象。

这个问题已经回答了What is JSONP all about?,但我之前不知何故错过了它。另一个解释跨域请求的好资源是devlog

我提出的其他问题都变得多余了!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-01
    • 2012-11-08
    • 2012-05-24
    • 2013-02-24
    • 2013-03-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多