使用Node.js的Axios调用Basecamp API分页时遇406 Not Acceptable错误
Basecamp API分页时Axios报406 'Not Acceptable'的解决思路
排查方向及修复方法
1. 修正Axios的参数序列化逻辑
Basecamp API对查询参数的格式可能卡得比较严,Axios默认的参数序列化可能和Postman的处理方式不一样,导致带page参数时请求格式不被接受。
可以手动指定参数序列化规则,避免自动编码干扰:
const axios = require('axios'); const bcApi = axios.create({ paramsSerializer: (params) => { // 手动拼接参数,保持原始格式 return Object.entries(params).map(([k, v]) => `${k}=${v}`).join('&'); } }); // 调用示例 bcApi.get('https://3.basecampapi.com/xxxxxxxxx/buckets/xxxxxxxxx/todosets/xxxxxxxxx/todolists.json', { params: { page: 2 }, headers: { 'Accept': 'application/json', 'Authorization': 'Bearer 你的访问令牌' // 必须带上Basecamp的授权头 } }) .then(res => console.log(res.data)) .catch(err => console.error(err.response.data));
2. 1:1复刻Postman的请求头
有时候你以为复制了所有头,但可能漏掉了User-Agent、Accept-Encoding这类看似无关的字段,Basecamp可能会校验这些细节。
直接用Postman的代码生成功能:打开你的Postman请求,点右上角「Code」,选择「Node.js - Axios」,把生成的代码直接拿来运行,对比你自己的代码找差异。
3. 检查Axios全局配置或拦截器
如果你的项目里配置了Axios全局拦截器,可能会偷偷修改请求头或者参数,比如全局设置了错误的Accept头,或者对参数做了额外编码。
加个请求拦截器打印完整配置,确认实际发送的头和参数:
bcApi.interceptors.request.use(config => { console.log('实际请求头:', config.headers); console.log('最终请求URL:', config.url); return config; });
4. 直接拼接page参数到URL里试试
有时候通过params传递参数会有隐藏的编码问题,试试把?page=2直接拼在URL末尾,绕过Axios的参数处理:
bcApi.get('https://3.basecampapi.com/xxxxxxxxx/buckets/xxxxxxxxx/todosets/xxxxxxxxx/todolists.json?page=2', { headers: { 'Accept': 'application/json', 'Authorization': 'Bearer 你的访问令牌' } })
总结
大概率是Axios的参数序列化或者请求头的细微差异导致的问题,按上面的步骤排查,尤其是复刻Postman代码和检查参数序列化这两点,应该能快速解决406错误。
内容的提问来源于stack exchange,提问作者nodnarbisc
相关产品推荐
相关产品推荐

