如何使用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();
答
两个项目,引起了我的注意:
- 分隔主机名和选项变量中的路径。
-
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(); }