调用Autodesk刷新Token接口时遭遇content-type header错误求助
问题分析与解决
你遇到的核心问题是Axios请求参数的位置错误:Autodesk的OAuth刷新令牌接口要求参数以application/x-www-form-urlencoded格式放在POST请求体中,但你的代码把参数放到了params字段里——这个字段对应的是URL的查询参数(即?key=value形式),而非请求体内容,所以接口会判定你没有正确传递参数,同时返回Content-Type相关的错误提示。
解决步骤
- 将参数从
params移到data字段:Axios的post方法第二个参数是请求体数据,第三个才是配置项(headers等)。 - 正确序列化请求体:因为接口要求
application/x-www-form-urlencoded格式,需要将参数对象序列化为url编码的字符串,可使用qs库或原生URLSearchParams实现。
修改后的代码示例
方式1:使用qs库(需先执行npm install qs安装)
const qs = require('qs'); bim360Router.use(async (req, res, next) => { let accessToken = req.cookies['access_token']; let refresh_token = req.cookies['refresh_token']; if(refresh_token && !accessToken) { const data = qs.stringify({ client_id: process.env.FORGE_CLIENT_ID, client_secret: process.env.FORGE_CLIENT_SECRET, refresh_token: refresh_token, grant_type: 'refresh_token', }); const config ={ headers : { 'Content-Type': 'application/x-www-form-urlencoded', } }; const response = await axios.post( 'https://developer.api.autodesk.com/authentication/v1/authenticate', data, config ); accessToken = response.data.access_token; res.cookie('access-token', accessToken, { maxAge: 60 * 60 * 1000, httpOnly: true }); console.log("middleware", response.data); } next(); });
方式2:使用原生URLSearchParams(无需额外安装依赖)
bim360Router.use(async (req, res, next) => { let accessToken = req.cookies['access_token']; let refresh_token = req.cookies['refresh_token']; if(refresh_token && !accessToken) { const data = new URLSearchParams({ client_id: process.env.FORGE_CLIENT_ID, client_secret: process.env.FORGE_CLIENT_SECRET, refresh_token: refresh_token, grant_type: 'refresh_token', }); const config ={ headers : { 'Content-Type': 'application/x-www-form-urlencoded', } }; const response = await axios.post( 'https://developer.api.autodesk.com/authentication/v1/authenticate', data, config ); accessToken = response.data.access_token; res.cookie('access-token', accessToken, { maxAge: 60 * 60 * 1000, httpOnly: true }); console.log("middleware", response.data); } next(); });
为什么curl能正常运行?
你用curl测试时,-d参数是直接把参数放到POST请求体中,并且curl会自动设置正确的Content-Type: application/x-www-form-urlencoded,完全匹配接口要求的格式,所以能成功获取令牌。
内容的提问来源于stack exchange,提问作者meteor314
相关产品推荐
相关产品推荐

