如何使用NodeJS从{Yelp Fusion API}获取访问令牌

时间:2017-02-19 15:43:25

标签: api oauth-2.0 yelp

我正在尝试获取Yelp API的访问令牌。

Yelp的API文档: https://www.yelp.com/developers/documentation/v3/get_started

我一直在终端上遇到错误:

problem with request: getaddrinfo ENOTFOUND api.yelp.com/oauth2/token api.yelp.com/oauth2/token:80 

这是我的NodeJS代码(我从节点文档站点中获取了很多代码):

var http = require("http");

var postData = JSON.stringify({
        "grant_type": "client_credentials",
        "client_id": "<<client id>>",
        "client_secret": "<<client secret no.>>"
      });

var options = {
  hostname: 'api.yelp.com/oauth2/token',
  port: 80,
  method: 'POST',
  headers: {
    'Content-Type': 'application/x-www-form-urlencoded',
    'Content-Length': Buffer.byteLength(postData)
  }
};

var req = http.request(options, (res) => {
  console.log(`STATUS: ${res.statusCode}`);
  console.log(`HEADERS: ${JSON.stringify(res.headers)}`);
  res.setEncoding('utf8');
  res.on('data', (chunk) => {
    console.log(`BODY: ${chunk}`);
  });
  res.on('end', () => {
    console.log('No more data in response.');
  });
});

req.on('error', (e) => {
  console.log(`problem with request: ${e.message}`);
});

// write data to request body
req.write(postData);
req.end();

1 个答案:

答案 0 :(得分:0)

引起我注意的两件事:

  1. 在选项变量中分隔主机名和路径。
  2. YELP Fusion API是HTTPS,而不是HTTP。使用HTTP可能会导致302响应(URL重定向)。

    var https = require('https');
    
    getYelpAccessCode(function(response) {
        var responseData = JSON.parse(response);
        if (responseData != null) {
            var accessCode = responseData.token_type + " " + responseData.access_token;
        }
    });
    
    function getYelpAccessCode(callback) {
    const postData = querystring.stringify({
        'client_id': YELP_CLIENT_ID,
        'client_secret': YELP_CLIENT_SECRET
        });
    
    const options = {
            hostname: 'api.yelp.com',
            path: '/oauth2/token',
            method: 'POST',
            headers: {
                'Content-Type': 'application/x-www-form-urlencoded',
                'Content-Length': Buffer.byteLength(postData)
            }
        };
    
    const req = https.request(options, (res) => {
            console.log(`STATUS: ${res.statusCode}`);
            console.log(`HEADERS: ${JSON.stringify(res.headers)}`);
    
            var body = '';
    
            res.setEncoding('utf8');
            res.on('data', (chunk) => {
                body += chunk;
                console.log(`BODY: ${chunk}`);
            });
            res.on('end', () => {
                console.log('No more data in response.');
                callback(body);
            });
        });
    
    req.on('error', (e) => {
        console.error(`problem with request: ${e.message}`);
    });
    
    // write data to request body
    req.write(postData);
    req.end();
    }