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

问题描述:

我正在尝试获取Yelp API的访问令牌。如何使用NodeJS从Yelp Fusion 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. 分隔主机名和选项变量中的路径。
  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(); 
    }