【发布时间】:2016-01-16 07:10:52
【问题描述】:
为了在我的网络应用程序中获取 Spotify API 的访问令牌(由他们的网络授权流程指定),我了解到我必须发出 POST 请求。但是,当我这样做时,由于跨域问题,我得到了XMLHttpRequest 500 Error。
我已经想出了如何允许 CORS GET 请求,但不确定如何为 POST 请求做同样的事情。 This link 提供配置提示,但将 GET 和 POST 的实际路由留空。
这是我的 Express.js 服务器的相关代码:
app.use(function(req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
next();
});
app.use(express.static(__dirname + '/public')); // looks in public directory, not root directory (protects files)
app.get('/', function(req, res) {
// res.header("Access-Control-Allow-Origin", "*");
// res.header("Access-Control-Allow-Headers", "X-Requested-With");
res.send(__dirname + '\\index.html')
});
app.post('/', function(req, res) {
res.send(req.body.spotify);
});
(spotify 是 spotify-web-api-js 节点模块)。
我之前尝试将app.get 的确切代码复制到app.post,但这会导致服务器崩溃。
这是我程序的 JavaScript 文件中的一段代码,它打算在用户单击一个按钮后发送POST 请求,该按钮将他们带到 Spotify 授权路径的开头并批准登录:
$('#spotify').on('click', function() {
$.support.cors = true;
$.post("https://accounts.spotify.com/api/token");
});
(在这种情况下,spotify 是 HTML 文件中按钮的 ID)
在这种情况下,我应该怎么做才能绕过 CORS 问题?这几天我都被难住了。
【问题讨论】:
-
您的服务器无法代表他们授予对 Spotify API 的访问权限(通过 CORS 或其他方式)。他们的应用程序本身必须以必要的标头响应以允许请求。如果没有,则客户端可能根本无法发出请求。旁注:有用于在 Node HTTP 应用程序中启用 CORS 的现有包,包括
cors。此外,对于除了最基本的请求之外的所有请求,可能会在它们之前发送preflightOPTIONS请求。 -
我已经安装了
cors包,但是我找不到POST请求的任何配置设置。在发送GET请求歌曲/艺术家数据时,我能够解决 CORS 访问问题。根据他们的开发网站,这是 Spotify 网络身份验证流程的一部分,这里的一名员工说应该使用POST,所以它应该在技术上是可能的...... -
通过在客户端执行此操作,您将在 HTTP 之上涉及same origin policy,从而创建了 CORS 的要求。 Spotify 可以选择是否在各个路径上启用 CORS,而且他们似乎选择不为
/api/token启用 CORS。因此,实现它的方法很可能是:不要尝试使用 Ajax 严格地在客户端执行它。在您的服务器中使用http.request()发出实际请求。
标签: jquery node.js express cors spotify