了解跨域XHR和XML数据

时间:2012-12-13 06:29:42

标签: javascript jquery ajax xmlhttprequest

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

问)我认为介于1和2之间,因为返回的数据格式为jsonFlickrFeed({}),我们需要编写jsonFlickrFeed回调函数才能使其正常工作?

问)为什么它永远不会调用成功回调?

问)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)
});​

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

问)由于上述原因,它被称为JQuery的简写方法?

无论我尝试过什么,我都无法使用XML数据。我无法想到使用XML数据而不是JSON的方法。

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

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

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

2 个答案:

答案 0 :(得分:1)

  

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

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

  

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

或使服务器支持CORS

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

我的观点是,如果域不允许来自客户端脚本的默认X源请求,则无法对此做任何事情。有些浏览器可能允许它,但它不是默认行为。在这种情况下,唯一的选择是同一域上的代理。

答案 1 :(得分:0)

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

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

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