我希望使用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
}
});
但是,我收到以下错误: 未捕获的SyntaxError:意外的令牌:
这在解析json结果时会发生 - 因为我使用的是jsonp,我希望结果以callFunction({json})的形式返回,但是我只是得到了json。但是,如果我进入Chrome中的“网络”选项卡并显示请求,请求本身就会成功,我可以查看正确分组的json结果(我可以展开messages属性并查看所有消息)。
似乎我可以获取数据,但不能使用它。有没有办法防止这个错误,或者我从一开始就做错了吗?
答案 0 :(得分: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的支持。