如何使用Access Token调用另一个POST请求?如何结合Async/Promise实现?
使用Access Token调用后续POST请求并结合Async/Promise实现流程
我已经实现了获取Access Token的POST请求且运行正常,现在想了解如何使用该Access Token调用另一个POST请求,以及如何结合async或Promise来实现这一流程。以下是我的原代码:
function getAccessToken() { const querystring = require('querystring'); const https = require('https') const postData = querystring.stringify({ 'grant_type': 'client_credentials' }); const options = { "hostname":'api.xxx.com', "method": "POST", "path" : "/token", "port" : 443, "encoding": "utf8", "followRedirect": true, "headers": { "Authorization": 'Basic ' + Buffer.from("client_id" + ':' + "client_secret").toString('base64'), "Content-Type": 'application/x-www-form-urlencoded', "Content-Length": Buffer.byteLength(postData), }, 'muteHttpExceptions': true } const body = [] const req = https.request(options, res => { console.log(`statusCode: ${res.statusCode}`) res.on('data', (chunk) => body.push(chunk)) res.on('end', () => { const access_token = Buffer.concat(body).toString() console.log(access_token) }) }) req.on('error', error => { console.error(error) }) req.write(postData); req.end() } getAccessToken();
实现步骤
1. 将getAccessToken改造为返回Promise的函数
原代码用回调处理异步结果,改成Promise后能更顺畅地结合async/await使用:
function getAccessToken() { const querystring = require('querystring'); const https = require('https') const postData = querystring.stringify({ 'grant_type': 'client_credentials' }); const options = { "hostname":'api.xxx.com', "method": "POST", "path" : "/token", "port" : 443, "encoding": "utf8", "followRedirect": true, "headers": { "Authorization": 'Basic ' + Buffer.from("client_id" + ':' + "client_secret").toString('base64'), "Content-Type": 'application/x-www-form-urlencoded', "Content-Length": Buffer.byteLength(postData), }, 'muteHttpExceptions': true }; // 用Promise封装异步请求,统一处理成功/失败结果 return new Promise((resolve, reject) => { const body = []; const req = https.request(options, res => { console.log(`statusCode: ${res.statusCode}`); res.on('data', (chunk) => body.push(chunk)); res.on('end', () => { try { // 解析Token接口返回的JSON数据(多数接口返回JSON格式) const tokenData = JSON.parse(Buffer.concat(body).toString()); resolve(tokenData.access_token); // 直接返回需要的access_token字段 } catch (err) { reject(err); } }); }); req.on('error', error => reject(error)); req.write(postData); req.end(); }); }
2. 编写携带Access Token的目标POST请求函数
同样用Promise封装,在请求头中加入获取到的Token:
function callProtectedAPI(accessToken, postData) { const https = require('https'); const querystring = require('querystring'); const formattedData = querystring.stringify(postData); const options = { "hostname":'api.xxx.com', // 替换为目标API的实际域名 "method": "POST", "path" : "/your-target-endpoint", // 替换为目标API的路径 "port" : 443, "headers": { "Authorization": `Bearer ${accessToken}`, // 按OAuth2.0标准携带Token,格式需匹配API要求 "Content-Type": 'application/x-www-form-urlencoded', "Content-Length": Buffer.byteLength(formattedData), } }; return new Promise((resolve, reject) => { const body = []; const req = https.request(options, res => { console.log(`API statusCode: ${res.statusCode}`); res.on('data', (chunk) => body.push(chunk)); res.on('end', () => { try { const responseData = JSON.parse(Buffer.concat(body).toString()); resolve(responseData); } catch (err) { reject(err); } }); }); req.on('error', error => reject(error)); req.write(formattedData); req.end(); }); }
3. 用async/await串联完整流程
通过async函数按顺序执行获取Token、调用目标API的操作,逻辑更直观:
async function runRequestFlow() { try { // 第一步:获取Access Token const accessToken = await getAccessToken(); console.log('获取到的Access Token:', accessToken); // 第二步:准备目标API的请求参数 const apiPostData = { key1: 'value1', key2: 'value2' // 替换为目标API需要的实际参数 }; // 第三步:调用目标POST请求 const apiResponse = await callProtectedAPI(accessToken, apiPostData); console.log('目标API返回结果:', apiResponse); } catch (error) { // 统一捕获整个流程中的错误 console.error('请求流程出错:', error); } } // 执行完整流程 runRequestFlow();
关键说明
- Promise封装:把异步的https请求包装成Promise,避免回调嵌套,让异步逻辑更易维护。
- async/await:在async函数中用await暂停执行,直到Promise返回结果,实现"同步写法处理异步逻辑"的效果。
- Token携带格式:多数OAuth2.0兼容API使用
Bearer {token}的格式,若目标API要求不同,需调整Authorization头的内容。
内容的提问来源于stack exchange,提问作者Kitty
相关产品推荐
相关产品推荐

