Last.Fm API-尝试在Node.js应用中使用track.scrobble服务时参数无效

时间:2018-07-11 16:29:15

标签: javascript node.js last.fm

我已经完成了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

1 个答案:

答案 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)