你如何在节点中发出这个卷曲请求

时间:2017-11-05 20:46:30

标签: node.js curl https request

这个对spotify API的curl请求完全正常

curl -X "POST" -H "Authorization: Basic <my-key-here>" -d grant_type=client_credentials https://accounts.spotify.com/api/token

我正在尝试在节点中执行此操作,但它无法正常工作并返回400 Bad Request。这是我的代码。我做错了什么?

function AuthRequest(key) {

  const req_body_params = JSON.stringify({
    grant_type: "client_credentials"
  })

  const base64_enc = new Buffer(key).toString("base64")

  const options = {
    host: "accounts.spotify.com",
    port: 443,
    path: "api/token",
    method: "POST",
    headers: {
      "Content-Type": "application/json",
      "Authorization": `Basic ${base64_enc}`
    }
  }

  const req = https.request(options, function (res) {
    res.on('data', function (data) {
      alert("success: " + data)
    })
  })

  req.on('error', function (err) {
    alert("error: " + err)
  })

  req.write(req_body_params)
  req.end()

}

我正在尝试使用客户端凭据方法,如下所述:https://developer.spotify.com/web-api/authorization-guide/

2 个答案:

答案 0 :(得分:1)

请求应该在application/x-www-form-urlencoded而不是JSON,它应该是const req_body_params = "grant_type=client_credentials",标题为"Content-Type": "application/x-www-form-urlencoded"

function AuthRequest(key) {
    const req_body_params = "grant_type=client_credentials";
    const base64_enc = new Buffer(key).toString("base64");

    const options = {
        host: "accounts.spotify.com",
        port: 443,
        path: "/api/token",
        method: "POST",
        headers: {
            "Content-Type": "application/x-www-form-urlencoded",
            "Authorization": `Basic ${base64_enc}`
        }
    };

    const req = https.request(options, function(res) {
        res.on('data', function(data) {
            alert("success: " + data)
        })
    });

    req.on('error', function(err) {
        alert("error: " + err)
    });

    req.write(req_body_params);
    req.end();
}

答案 1 :(得分:0)

因为令牌过期对于动态请求它们是好的,所以我创建了一个方法,将令牌作为承诺输出,然后您可以在请求中使用。

const axios = require('axios')

const client_id = process.env.SPOTIFY_CLIENT_ID;
const client_secret = process.env.SPOTIFY_CLIENT_SECRET;

function getToken( ) {
    return axios({
        url: 'https://accounts.spotify.com/api/token',
        method: 'post',
        params: {
            grant_type: 'client_credentials'
        },
        headers: {
            'Content-Type': 'application/x-www-form-urlencoded'
        },
        auth: {
            username: client_id,
            password: client_secret
        }
   })
}


async function getSpotifyData( endpoint ){
    const tokenData = await getToken( );
    const token = tokenData.data.access_token;
    axios({
        url: `https://api.spotify.com/v1/${endpoint}`,
        method: 'get',
        headers: {
            'Authorization': 'Bearer ' + token
        }
    }).then( response =>  {
        console.log( response.data );
        return response.data;
    }).catch( error =>  {
        throw new Error(error);
    });
}
getSpotifyData( 'browse/new-releases' );