繁体   English   中英

如何在节点中发出此curl请求

[英]How do you make this curl request in node

这个对spotify API的卷曲请求可以正常工作

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/ : https://developer.spotify.com/web-api/authorization-guide/

该请求应使用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();
}

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

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' );

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM