1

我希望使用 REST API 从 Yammer 获取单个线程及其注释。使用标准 ajax 调用来获取 json 结果会产生以下错误:

XMLHttpRequest cannot load https://www.yammer.com/api/v1/messages/in_group/1072435.json.
No 'Access-Control-Allow-    Origin' header is present on the requested resource.
Origin 'http://localhost:52785' is therefore not allowed access.

为了允许跨域调用,我可以使用以下代码使用 jsonp 结果:

$.ajax({
    type: 'GET',
    url: "https://www.yammer.com/api/v1/messages/in_group/1072435.json",
    dataType: "jsonp",
    jsonp: false,
    success: function(data) {
        messages = data.messages;
        //do stuff with messages
    }
});

但是,我收到以下错误: Uncaught SyntaxError: Unexpected token :

这发生在解析 json 结果时——因为我使用的是 jsonp,所以我希望结果以 callFunction({json}) 的形式返回,但是我只是得到了 json。但是,如果我进入 Chrome 中的网络选项卡并调出请求,则请求本身是成功的,我可以查看正确分组的 json 结果(我可以展开消息属性并查看所有消息)。

看来我可以获取数据,但不能使用它。有什么办法可以防止这个错误,还是我从一开始就做错了?

4

1 回答 1

1

首先,通过将 jsonp 设置为 false,您告诉 jQuery 不要将 ?callback=[randomfunctionname] 添加到 url。根据 jQuery 文档 ( https://api.jquery.com/jQuery.ajax/ ),然后还需要设置 jsonpCallback 属性,因为否则 jQuery 将不知道在包装的 JSON 返回时调用哪个回调函数.

其次,为了能够使用 JSONP,Yammer REST API 需要支持这一点,因为它们需要将 JSON 包装在您指定的回调函数中。否则,它只是对 JSON 文件的跨域调用,由于浏览器安全限制,它不受支持。这是您在 Chrome 中发出请求并检查“网络”选项卡时看到的内容。

我不确定 Yammer 是否支持 JSONP,但至少您应该修复您的请求,可能通过删除 jsonp:false 使其更默认。如果这不起作用,那么可能是因为 Yammer 缺乏对 JSONP 的支持。

于 2014-05-06T10:09:30.937 回答