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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 15:10:58