我正在开发一个页面,通过jQuery的AJAX支持从Flickr和Panoramio提取图像。

Flickr端工作正常,但当我尝试$。get(url,回调)从全景,我看到一个错误在Chrome的控制台:

XMLHttpRequest无法加载http://www.panoramio.com/wapi/data/get_photos?v=1&key=dummykey&tag=test&offset=0&length=20&callback=processImages&minx=-30&miny=0&maxx=0&maxy=150。Access-Control-Allow-Origin不允许原点为空。

如果我直接从浏览器中查询该URL,它可以正常工作。这是怎么回事,我能回避吗?我是否错误地编写了我的查询,或者这是Panoramio所做的阻碍我试图做的事情?

谷歌在错误消息中没有找到任何有用的匹配。

EDIT

下面是一些显示问题的示例代码:

$().ready(function () {
  var url = 'http://www.panoramio.com/wapi/data/get_photos?v=1&key=dummykey&tag=test&offset=0&length=20&callback=processImages&minx=-30&miny=0&maxx=0&maxy=150';

  $.get(url, function (jsonp) {
    var processImages = function (data) {
      alert('ok');
    };

    eval(jsonp);
  });
});

您可以在线运行示例。

编辑2

谢谢达林的帮助。上面的代码是错误的。用这个代替:

$().ready(function () {
  var url = 'http://www.panoramio.com/wapi/data/get_photos?v=1&key=dummykey&tag=test&offset=0&length=20&minx=-30&miny=0&maxx=0&maxy=150&callback=?';

  $.get(url, function (data) {
    // can use 'data' in here...
  });
});

当前回答

对于一个简单的HTML项目:

cd project
python -m SimpleHTTPServer 8000

然后浏览您的文件。

其他回答

最后一点,Mozilla文档明确说明了这一点

如果头是通配符,上面的例子将失败: Access-Control-Allow-Origin: *。由于Access-Control-Allow-Origin明确提到http://foo.example, 凭证识别内容返回给调用web 内容。

因此,使用'*'不仅仅是一个坏习惯。根本不管用:)

在我的例子中,同样的代码在Firefox上运行良好,但在谷歌Chrome上就不行了。谷歌Chrome的JavaScript控制台说:

XMLHttpRequest cannot load http://www.xyz.com/getZipInfo.php?zip=11234. 
Origin http://xyz.com is not allowed by Access-Control-Allow-Origin.
Refused to get unsafe header "X-JSON"

我不得不放弃Ajax URL的www部分,以便它与原始URL正确匹配,然后它工作得很好。

适用于我的谷歌Chrome v5.0.375.127(我得到警报):

$.get('http://www.panoramio.com/wapi/data/get_photos?v=1&key=dummykey&tag=test&offset=0&length=20&callback=?&minx=-30&miny=0&maxx=0&maxy=150',
function(json) {
    alert(json.photos[1].photoUrl);
});

另外,我建议你使用$.getJSON()方法,因为前面的方法在IE8上不起作用(至少在我的机器上):

$.getJSON('http://www.panoramio.com/wapi/data/get_photos?v=1&key=dummykey&tag=test&offset=0&length=20&callback=?&minx=-30&miny=0&maxx=0&maxy=150', 
function(json) {
    alert(json.photos[1].photoUrl);
});

你可以从这里上网试试。


更新:

现在你已经展示了你的代码,我可以看到它的问题。您同时拥有匿名函数和内联函数,但它们都将被称为processImages。这就是jQuery的JSONP支持的工作方式。注意到我是如何定义callback=?这样你就可以使用匿名函数。您可以在文档中阅读更多关于它的信息。

另一个注释是你不应该调用eval。传递给匿名函数的参数已经被jQuery解析为JSON。

伙计们,

我也遇到过类似的问题。但是使用Fiddler,我能够解决这个问题。问题是在Web API端CORS实现中配置的客户端URL不能有后面的正斜杠。在通过谷歌Chrome浏览器提交您的请求后,检查Fiddler头部部分的TextView选项卡,错误消息如下所示:

*"指定的策略来源your_client_url:/'无效。它不能以向前的斜杠结束。”

这真的很奇怪,因为它在ie浏览器上没有任何问题,但在使用谷歌Chrome浏览器测试时让我头疼。

我删除了CORS代码中的正斜杠并重新编译了Web API,现在可以通过Chrome和Internet Explorer访问API,没有任何问题。请试一试。

谢谢, 安迪

对于一个简单的HTML项目:

cd project
python -m SimpleHTTPServer 8000

然后浏览您的文件。