Node.js中用https模块调用Intuit OAuth2刷新Token失败求助
解决Intuit OAuth2刷新令牌生成Access Token的400错误问题
你的https模块代码存在几个关键问题导致400无效请求,以下是修正后的代码及问题说明:
修正后的代码
async function quickbookTokenHttps() { const https = require('https'); const querystring = require('querystring'); // 用于编码表单数据 const headers = { Authorization: 'Basic <Authorization code found on https://developer.intuit.com/app/developer/playground>', Accept: 'application/json', 'Content-Type': 'application/x-www-form-urlencoded', }; const bodyObj = { grant_type: 'refresh_token', refresh_token: '<Refresh token found on https://developer.intuit.com/app/developer/playground>', }; // 将对象编码为x-www-form-urlencoded格式的字符串 const body = querystring.stringify(bodyObj); // 补充Content-Length请求头 headers['Content-Length'] = Buffer.byteLength(body); const options = { hostname: 'oauth.platform.intuit.com', path: '/oauth2/v1/tokens/bearer', method: 'POST', headers: headers, }; // 封装https.request为Promise,适配async/await语法 return new Promise((resolve, reject) => { const req = https.request(options, (res) => { let result = ''; console.log(res.statusCode); console.log(res.statusMessage); res.on('data', (chunk) => { result += chunk; }); res.on('end', () => { try { const parsedResult = JSON.parse(result); console.log(parsedResult); resolve(parsedResult); } catch (err) { reject(err); } }); }); req.on('error', (err) => { console.log(err); reject(err); }); // 将编码后的请求体写入请求 req.write(body); req.end(); }); }
关键问题说明
- 表单数据未编码:axios会自动将
data对象按照application/x-www-form-urlencoded格式编码,但https模块无此自动处理能力,必须用querystring.stringify()将对象转换为key=value&key2=value2的字符串格式,否则服务器无法解析请求体。 - 错误的options参数:https模块的
options中不存在data或body属性,不能直接将请求体放在options内,必须通过req.write()方法写入请求。 - 缺少Content-Length头:发送带请求体的POST请求时,需在headers中指定
Content-Length,对应编码后字符串的字节长度,服务器依赖该头读取完整请求体。 - https.request非Promise类型:原代码直接用
await修饰https.request()无效,因为它不返回Promise,需手动封装为Promise才能适配async/await语法。
内容的提问来源于stack exchange,提问作者kevin
相关产品推荐
相关产品推荐

