我正在尝试创建一个Android应用程序,它包含一个功能,你可以通过名字搜索Spotify用户。使用Spotify时,你可以通过用户的ID或姓名搜索用户。然而,目前,我认为Spotify Web API无法支持按姓名搜索用户。如果您有用户ID,就可以使用Web API访问他们的配置文件。但我希望有一种方法,你可以运行一个用户名的搜索,并得到他们的ID这样做。
Spotify的Web API允许你搜索“曲目”或“艺术家”,在那里他们会返回所有的搜索结果。那么为什么不能对用户名做同样的处理呢?有没有什么办法能让这一切顺利,而我只是没看到?
我认为这是一个有趣的问题,因为它考虑的是一个庞大社区的用户数据,所以我会尝试弄清楚。
首先,您可以清楚地看到Spotify Web API端点search
有一个type
参数,该参数只允许以下类型:Artister
,PlayList
和Track
。让我们尝试从这里运行它(注意:请参阅promise.all
解决方案来获取我在这里使用的数据)
注意最近的Spotifysearch
API需要在请求头中指定访问令牌:
-H "Authorization: Bearer {your access token}"
null
var spotifyAccessToken = "YourSpotifyAccessToken";
var console = {
log: function(s) {
document.getElementById("console").innerHTML += s + "<br/>"
}
}
// Simple XMLHttpRequest
// based on https://davidwalsh.name/xmlhttprequest
SimpleRequest = {
call: function(what, response) {
var request;
if (window.XMLHttpRequest) { // Mozilla, Safari, ...
request = new XMLHttpRequest();
} else if (window.ActiveXObject) { // IE
try {
request = new ActiveXObject('Msxml2.XMLHTTP');
} catch (e) {
try {
request = new ActiveXObject('Microsoft.XMLHTTP');
} catch (e) {}
}
}
// state changes
request.onreadystatechange = function() {
if (request.readyState === 4) { // done
if (request.status === 200) { // complete
response(request.responseText)
} else response();
}
}
request.open('GET', what, true);
request.setRequestHeader("Authorization", "Bearer " + spotifyAccessToken);
request.send(null);
}
}
//PromiseAll
var promiseAll = function(items, block, done, fail) {
var self = this;
var promises = [],
index = 0;
items.forEach(function(item) {
promises.push(function(item, i) {
return new Promise(function(resolve, reject) {
if (block) {
block.apply(this, [item, index, resolve, reject]);
}
});
}(item, ++index))
});
Promise.all(promises).then(function AcceptHandler(results) {
if (done) done(results);
}, function ErrorHandler(error) {
if (fail) fail(error);
});
}; //promiseAll
// LP: deferred execution block
var ExecutionBlock = function(item, index, resolve, reject) {
var url="https://api.spotify.com/v1/"
url+=item;
SimpleRequest.call(url, function(result) {
if (result) {
console.log( JSON.stringify( result, null, 2)
.replace(/\\n/g,"<br>").replace(/\\"/g,'"'));
resolve(result);
} else {
reject(new Error("call error"));
}
})
}
arr = [
"search?type=playlist&q=%22doom%20metal%22",
"search?type=playlist&q=Adele"]
promiseAll(arr, function(item, index, resolve, reject) {
console.log("Making request [" + index + "]")
ExecutionBlock(item, index, resolve, reject);
}, function(results) { // aggregated results
console.log("All response received " + results.length);
//console.log(JSON.stringify(results));
}, function(error) { // error
console.log(error);
});
<div id="console" />