我在构建一个使用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)
我仍然没有得到错误响应的标题。您可以在下面看到成功请求的输出,然后输出错误:
你能通过你的请求片段吗?主要是你如何处理响应。 – ipinak
已添加了呼叫和错误处理的详细信息。 – Roaders
我认为您使用的库可能存在问题。 “错误”包含什么? – ipinak