我已经完成了Last.Fm身份验证过程(概述为here),并且工作得很好-重新获得了会话密钥以及所有内容。但是,当我尝试向Last.Fm API的track.scrobble方法发出经过身份验证的POST请求时,我始终收到“无效参数-您的请求缺少必需参数”的响应(Last.FM API错误# 6)。
我很困惑为什么会这样,因为我几乎是肯定的,我在track.scrobble调用中包括了所有必需的参数。我在这里做什么错了?
这是我的scrobble跟踪方法:
scrobbleTrack(track) {
const timestamp = Date.now();
let params = {
artist: track.artist,
track: track.title,
duration: track.duration,
timestamp: timestamp,
api_key: this.apiKey,
method: 'track.scrobble',
sk: this.sessionKey,
};
const apiSig = this._createApiSig(params);
params.api_sig = apiSig;
params.format = 'json';
const body = JSON.stringify(params);
request.post(this.baseUrl, { //this.baseUrl is "http://ws.audioscrobbler.com/2.0/?format=json"
headers: {
'Content-Type': 'application/json'
},
body: body
}, function(err, res) {
if(err) { return err; }
});
然后这是我的_createApiSig方法:
_createApiSig(params) {
let apiSig = '';
const keys = Object.keys(params).sort();
for(let key of keys) {
apiSig += key + params[key];
}
apiSig += this.secret;
return md5(encodeURIComponent(apiSig));
}
据我所知,我正在提供track.scrobble的所有必需参数(艺术家,track,api_key,api_sig,sk,时间戳)。
要进一步参考,请here is the documentation for the API endpoint I'm trying to access。
答案 0 :(得分:0)
任何可能遇到此问题的人,对我有用的是在请求的正文数据中使用 URLsearchparam 对象而不是 JSON.stringify
基本上:
let data = new URLSearchParams(params)
let myReq = new Request("http://ws.audioscrobbler.com/2.0/", {
method: "POST",
body: data
})
fetch(myReq)