在使用Meteor HTTP在Spotify API上请求access_token时,我无法解决问题。实际上,当我对Spotify https://accounts.spotify.com/api/token进行POST调用时。我收到以下回复:
{"statusCode":400,"content":"{\"error\":\"unsupported_grant_type\",\"error_description\":\"grant_type must be client_credentials, authorization_code or refresh_token\"}"
我认为这可能与Content-Type标头和BODY参数的编码有关,但我无法解决此问题。我试图同时使用数据和参数,但这些都没有用。
这是我的代码:
HTTP.post("https://accounts.spotify.com/api/token", {
data: {
grant_type : "authorization_code",
code : authCode,
redirect_uri : Router.routes['redirect_spotify'].url()
},
headers: {
'Authorization' : "Basic " + CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse("xxxx:yyyyy")),
'Content-Type':'application/x-www-form-urlencoded'
}
}, function(error, result) {
console.log("POST made with data : %j", result);
if (error){
Registrations.remove({userId : this.userId });
return;
}
Registrations.update({
userId : this.userId },
{$set : {
state: "Done",
accessToken: result.access_token,
//TODO expires
refreshToken: result.refresh_token
}},
{ upsert : true}
);
});
提前谢谢大家:) Love Meteor
答案 0 :(得分:12)
您需要使用params
代替data
。因此,您的代码将是:
HTTP.post("https://accounts.spotify.com/api/token", {
params: {
grant_type : "authorization_code",
code : authCode,
redirect_uri : Router.routes['redirect_spotify'].url()
},
headers: {
'Authorization' : "Basic " + CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse("xxxx:yyyyy")),
'Content-Type':'application/x-www-form-urlencoded'
}
}, function(error, result) {
...
});
答案 1 :(得分:0)
我怀疑此处的问题是您的Content-Type
应设置为application/json
而不是application/x-www-form-urlencoded
。
答案 2 :(得分:0)
当方法为POST时,以请求主体中的格式查询参数发送数据也可以使用。
例如: 在请求正文中以以下形式发送数据值,即name ='Tommy'和age = 26
name=Tommy&age=26