You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 15:15:40