axios Spotify在令牌端点上返回200,但响应数据已编码

odopli94  于 2023-05-06  发布在  iOS
关注(0)|答案(1)|浏览(117)

我正在通过this tutorial创建一个使用Spotify API的应用程序。一切都进行得很顺利,直到我使用身份验证代码流进行身份验证的回调部分。
(我在Spotify应用程序中注册了回叫URL。)
就我所知,我的代码与本教程和其他教程使用的回调路由相匹配。值得注意的是,http库是axios。下面是回调方法:

app.get("/callback", (req, res) => {
        const code = req.query.code || null;

        const usp = new URLSearchParams({
            code: code,
            redirect_uri: REDIRECT_URI,
            grant_type: "authorization_code",
        });

        axios({
                    method: "post",
                    url: "https://accounts.spotify.com/api/token",
                    data: usp,
                    headers: {
                        "content-type": "application/x-www-form-urlencoded",
                        Authorization: `Basic ${new Buffer.from(`${CLIENT_ID}:${CLIENT_SECRET}`).toString("base64")}`,
  },
})
  .then(response => {
    console.log(response.status); // logs 200
    console.log(response.data); // logs encoded strings
    if (response.status === 200) {
      res.send(JSON.stringify(response.data))
    } else {
      res.send(response);
    }
  })
  .catch((error) => {
    res.send(error);
  });

虽然响应代码是200,但下面是www.example.com中返回的示例response.data:"\u001f�\b\u0000\u0000\u0000\u0000\u0000\u0000\u0003E�˒�0\u0000Ee�uS\u0015��\u000e�(\b\u0012h\u0005tC%\u0010\u0014T\u001e�����0��^޳:���p\u0014Ѻ\u000e��Is�7�:��\u0015l��ᑰ�g�����\u0"
它看起来像是被编码的,但是我不知道它是如何被编码的(我尝试了base-64解编码),也不知道为什么它不是以普通JSON的形式返回的。这不仅阻止了我将它记录到控制台--我也不能访问我希望在响应主体中存在的字段,比如access_token。是否有什么参数可以传递给axios来告诉我“这应该是json”?
有趣的是,如果我使用npm 'request'包而不是axios,并将'json:true'参数,我得到了一个有效的令牌,我可以打印出来,并作为一个常规的旧字符串查看。下面是可以工作的代码。但我真的很想了解为什么我的axios方法不能。

app.get('/callback', function(req, res) {
        // your application requests refresh and access tokens
        // after checking the state parameter

        const code = req.query.code || null;
        const state = req.query.state || null;
        const storedState = req.cookies ? req.cookies[stateKey] : null;

        res.clearCookie(stateKey);
        const authOptions = {
                url: 'https://accounts.spotify.com/api/token',
                form: {
                    code: code,
                    redirect_uri: REDIRECT_URI,
                    grant_type: 'authorization_code',
                },
                headers: {
                    Authorization: `Basic ${new Buffer.from(`${CLIENT_ID}:${CLIENT_SECRET}`).toString('base64')}`,
                },
                json: true,
    };

  request.post(authOptions, function (error, response, body) {
    if (!error && response.statusCode === 200) {
      const access_token = body.access_token;
      const refresh_token = body.refresh_token;

      var options = {
        url: 'https://api.spotify.com/v1/me',
        headers: { Authorization: 'Bearer ' + access_token },
        json: true,
    };

    // use the access token to access the Spotify Web API
    request.get(options, function(error, response, body) {
        console.log(body);
    });
    // we can also pass the token to the browser to make requests from there
    res.redirect('/#' + querystring.stringify({
        access_token: access_token,
        refresh_token: refresh_token,
    }));
    } else {
      res.redirect(`/#${querystring.stringify({ error: 'invalid_token' })}`);
    }
  });

});

hkmswyz6

hkmswyz61#

您需要在www.example.com标题中添加Accept-Encodingapplication/jsonaxios.post。
默认值为gzip

headers: {
   "content-type": "application/x-www-form-urlencoded",
   'Accept-Encoding': 'application/json'
   Authorization: `Basic ${new Buffer.from(`${CLIENT_ID}:${CLIENT_SECRET}`).toString("base64")}`,
  }

相关问题