我创建了角度js应用程序,其中我整合了twitch api,api是
return $http({
url: "https://api.twitch.tv/kraken/streams",
method: "GET",
params: { channel: channel, limit: 1 },
headers: { "Client-Id": "XXXXXXXXXXXXXXX" }
})
问题是当我重新加载页面时api正在工作但是当我的状态发生变化而没有页面重新加载时我从这个api得到了交叉原点错误。 错误是
无法加载https://api.twitch.tv/kraken/streams?channel=eliazOne&limit=1:预检响应中的Access-Control-Allow-Headers不允许使用请求标头字段RefreshToken。
任何人都知道如何解决交叉错误
答案 0 :(得分:0)
当您向其他域发出请求时,这称为跨域请求。也称为CORS请求。
当您将数据POST / PUT到其他域时,它将首先发出OPTIONS请求。这是为了确保服务器在响应上具有Access-Control-Allow-Headers。这些标头应该允许访问您发出请求的域。如果这些标题不存在,那么当OPTIONS请求发出时,它将失败并且永远不会发出POST / PUT。
有关详细信息,请参阅此处https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#Preflighted_requests
简单的答案是将这些标题添加到您的服务器。
答案 1 :(得分:0)
我不知道Angular默认情况下是否会这样做,或者如果它是代码中其他地方的错误,但您或Angular正在发送RefreshToken
标头作为您的失败请求,在飞行前OPTIONS请求中的Access-Control-Allow-Headers
响应标头中不允许这样做。
$ curl -XOPTIONS https://api.twitch.tv/kraken/streams -is | grep Headers
Access-Control-Allow-Headers: Accept, Accept-Language, Authorization, Client-Id, Twitch-Api-Token, X-Forwarded-Proto, X-Requested-With, X-Csrf-Token, Content-Type, X-Device-Id
这是所有跨源请求都可以做到的事情。浏览器发送一个OPTIONS请求,以确保跨域服务器设置的标准允许它要发出的真实请求。
答案 2 :(得分:-1)
你需要添加一个?callback =?使用您传递的URL和回调函数。请点击How to use JQuery to Access Twitch streams链接 这是JQuery的例子,但概念是一样的。
$.getJSON('https://api.twitch.tv/kraken/streams/' + name + '?callback=?',
function(channel){
if (channel["stream"] == null) {
$("#all").append("<p>" + channel._links.self + "</p>");
}
else {
$("#all").append("<p>Fail</p>");
}
});
});