我正在构建一个AJAX应用程序来查询OData端点。我一直在用Netflix OData feed进行一些测试,发现了一些我得不到的东西:
当我对url(例如http://odata.netflix.com/v1/Catalog/Titles)发出.ajax()请求时,我收到错误:“Access-Control-Allow-Origin不允许使用Origin null”。但是,当我将相同的URL放入浏览器时,请求会通过,我会收到回复。
我没有得到的根本区别是什么?浏览器如何绕过同源策略?
答案 0 :(得分:2)
我还将JSONP用于Netflix的OData。它似乎适用于我的应用程序。我已在我的博客http://bit.ly/95HXLM
下发布了代码和说明下面的一些示例片段:
49. // Make JSONP call to Netflix
50. $.ajax({
51. dataType: "jsonp",
52. url: query,
53. jsonpCallback: "callback",
54. success: callback
55. });
56. });
57.
58. function callback(result) {
59. // unwrap result
60. var movies = result.d.results;
61.
62. $("#movieTemplateContainer").empty();
63. $("#movieTemplate").tmpl(movies).appendTo("#movieTemplateContainer");
64. }
答案 1 :(得分:1)
相同的源策略适用于从加载来自远程站点的页面的代码内发出的HTTP请求。机器不允许该代码发出来自不同域的内容的新请求,假设您(受控制的用户)可以从haxors.r.us获取内容,但您不希望该网站发布如果没有您的说法,请向bankofamerica.com发送HTTP请求。但是,浏览器应允许您(受控制的用户)向任何地方发出HTTP请求。事实上,随着人类在机器的阴影中消失,我要求它。 我要求了!
您可以从服务器向该URL发出请求,然后将响应传递给客户端上的代码(在您的服务器代码可能选择进行任何类型的过滤或提取之后)。或者,Netflix可能支持JSONP API,这将允许您的客户端代码以脚本提取的方式发出GET请求,并将结果解释为Javascript代码。
还应该注意的是,这个策略与jQuery本身没什么关系。这是XMLHttpRequest机制的基本安全规则。