我正在开发一个页面,通过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...
  });
});

当前回答

并非所有服务器都支持jsonp。它要求服务器在结果中设置回调函数。我使用这个来从返回纯json但不支持jsonp的站点获取json响应:

function AjaxFeed(){

    return $.ajax({
        url:            'http://somesite.com/somejsonfile.php',
        data:           {something: true},
        dataType:       'jsonp',

        /* Very important */
        contentType:    'application/json',
    });
}

function GetData() {
    AjaxFeed()

    /* Everything worked okay. Hooray */
    .done(function(data){
        return data;
    })

    /* Okay jQuery is stupid manually fix things */
    .fail(function(jqXHR) {

        /* Build HTML and update */
        var data = jQuery.parseJSON(jqXHR.responseText);

        return data;
    });
}

其他回答

这是同源策略,您必须使用运行在同一主机上的JSON-P接口或代理。

郑重声明,据我所知,你有两个问题

You weren't passing a "jsonp" type specifier to your $.get, so it was using an ordinary XMLHttpRequest. However, your browser supported CORS (Cross-Origin Resource Sharing) to allow cross-domain XMLHttpRequest if the server OKed it. That's where the Access-Control-Allow-Origin header came in. I believe you mentioned you were running it from a file:// URL. There are two ways for CORS headers to signal that a cross-domain XHR is OK. One is to send Access-Control-Allow-Origin: * (which, if you were reaching Flickr via $.get, they must have been doing) while the other was to echo back the contents of the Origin header. However, file:// URLs produce a null Origin which can't be authorized via echo-back.

第一个问题通过Darin建议使用$. getjson迂回解决。它做了一个小魔术,改变请求类型从默认的“json”到“jsonp”,如果它看到子字符串callback=?在URL中。

这解决了第二个问题,不再尝试从文件:// URL执行CORS请求。

为了让其他人更清楚,这里有一些简单的故障排除说明:

如果您尝试使用JSONP,请确保以下情况之一: 你正在使用$。get和设置dataType为jsonp。 你正在使用$。getJSON和包含callback=?在URL中。 如果您试图通过CORS进行跨域XMLHttpRequest… 请确保通过http://.进行测试通过file://运行的脚本对CORS的支持有限。 确保浏览器实际支持CORS。(Opera和ie浏览器姗姗来迟)

对于一个简单的HTML项目:

cd project
python -m SimpleHTTPServer 8000

然后浏览您的文件。

伙计们,

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

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

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

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

谢谢, 安迪

你可能需要在你调用的脚本中添加一个HEADER,这是我在PHP中必须做的:

header('Access-Control-Allow-Origin: *');

更多细节在跨域AJAX ou services WEB(法语)。