我使用Yeoman的angular-fullstack生成器进行登录和身份验证。
当我发布用于身份验证的代码并发出YouTube API请求时,它可以完美运行。但是,当我取消注释身份验证代码,登录并生成相同的YouTube API请求时,它无法正常工作。
这里发生了什么:
它以某种方式向两次提出相同的API请求(到videos?part=...
)。当我没有登录时,它只发生一次。
所以第一个成功:
但第二个是不成功的:
我有两个问题:
1)为什么要生成第二个HTTP请求?
以下是用于发出请求的代码的摘录:
console.log('before request');
$http.get('https://www.googleapis.com/youtube/v3/videos?part=snippet%2C+contentDetails&id='+videoId+'&key='+API_KEY)
.success(function(result) {
console.log('success');
var item = result.items[0];
vm.skim.title = item.snippet.title;
vm.skim.description = item.snippet.description;
"在请求之前"只记录一次,我无法弄清楚生成第二个HTTP请求的内容。
2)为什么第二个HTTP请求不成功?请求之间的唯一区别似乎是Authorization标头。我对此并不了解,但它似乎是一个request with credentials,根据我的理解,响应有access-control-allow-credentials: true
的事实应该可以使这个工作。
我不确定我应该发布什么代码,所以here就是GitHub上的所有代码。
编辑:当我注释掉授权代码时,这是一个成功的请求。
答案 0 :(得分:1)
第一个请求是“预检请求”:OPTION
请求以确保远程服务器允许您发出真实请求(浏览器需要access-control-allow-origin
)。在尝试记录查询时只有它,这似乎很奇怪,但这可能是access-control-max-age
的副作用:此预检请求的缓存持续时间。
第二个请求是真实的POST
。 Google documentation说:
如果您提交访问受保护资源的请求,则API会返回HTTP 401响应代码(未授权),该访问令牌已过期,出现故障,范围不正确或因某些其他原因无效。
您应该查看“调用YouTube数据API”部分,看看您的令牌是否有效以及sample request是否有效。
关于access-control-allow-credentials
:默认行为是不发送任何Cookie(并且不会没有此标头),您可以使用$http.get('...', {withCredentials: true})
发送它们。