2016-01-23 69 views
2

我在构建一个使用Spotify API的应用程序。目前,用户可以粘贴曲目并获取每首曲目的信息。我的一个播放列表有500首歌曲,因此浏览器可以快速连续播放500个电话。这违反了API速率限制,我得到一个错误,这些头回:访问Spotify API呼叫响应中的标头

HTTP/1.1 429 Too Many Requests 
Server: nginx 
Date: Sat, 23 Jan 2016 11:47:52 GMT 
Transfer-Encoding: chunked 
Connection: keep-alive 
Keep-Alive: timeout=600 
Retry-After: 7 
Access-Control-Allow-Origin: * 
Access-Control-Allow-Methods: GET, POST, OPTIONS, PUT, DELETE 
Access-Control-Allow-Credentials: true 
Access-Control-Max-Age: 604800 
Access-Control-Allow-Headers: Accept, Authorization, Origin, Content-Type 
Content-Encoding: gzip 

我绑访问Retry-After头,但在我的代码使用headers()函数从角$http服务,我得到一个空目的。我的代码无法看到任何头文件。

我已阅读的有关访问标题的所有问题均指向更改由服务器返回的Access-Control-Expose-Headers以允许客户端获取标题。由于我无法控制Spotify服务器,我显然无法更改此设置。

看看上面的标题,似乎我永远不能访问Retry-After标题,因为它不包含在Access-Control-Allow-Headers列表中。

有什么我可以做的,以访问此标头?我确实看到有关在$httpProvider服务中更改默认设置的一些信息,但似乎无法使其工作。

如果它是相关这里有我的请求头:

GET /v1/tracks/1KsI8NEeAna8ZIdojI3FiT HTTP/1.1 
Host: api.spotify.com 
Connection: keep-alive 
Pragma: no-cache 
Cache-Control: no-cache 
Accept: application/json, text/plain, */* 
Origin: http://localhost:63342 
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.111 Safari/537.36 
Referer: http://localhost:63342/SpotifyExportTool/index.html 
Accept-Encoding: gzip, deflate, sdch 
Accept-Language: en-GB,en-US;q=0.8,en;q=0.6 

我的要求是这样的:

return Rx.Observable.fromPromise<IHttpPromiseCallbackArg<ITrackDetails>>(this.$http.get(`https://api.spotify.com/v1/tracks/${trackId}`)) 
    .retry(3) 
    .catch((error) => { 
     var headers: any = error.headers(); 
     return Rx.Observable.throw<ITrackDetails>(<ITrackError>{ id: trackId, error: error }); 
    }) 
    .pluck<ITrackDetails>("data"); 

页眉VAR始终是一个空的对象。这里的错误是一个响应对象,详见here

我设法在Js bin中重新创建了这个。这不使用角码或XMLHttpRequest以外的任何东西:

var req = new XMLHttpRequest(); 
req.open('GET', "https://api.spotify.com/v1/tracks/0YGQ3hZcRLC5YX7o0hdmHg", false); 
req.send(null); 
var headers = req.getAllResponseHeaders().toLowerCase(); 

console.log(req.status) 
console.log(headers) 

我仍然没有得到错误响应的标题。您可以在下面看到成功请求的输出,然后输出错误: enter image description here

+0

你能通过你的请求片段吗?主要是你如何处理响应。 – ipinak

+0

已添加了呼叫和错误处理的详细信息。 – Roaders

+0

我认为您使用的库可能存在问题。 “错误”包含什么? – ipinak

回答

1

您应该在一个请求中获取多个曲目。 https://developer.spotify.com/web-api/get-several-tracks/

它不能帮助您解决您在限速时遇到的问题,但速度会更快,并且可能会阻止您变成限速。

+2

是的,我知道,我要授权用户并获取用户播放列表,因此这将是不必要的,但我将此作为学习练习,因此想知道为什么这不起作用。无论如何感谢您的答案。 – Roaders