使用UrlFetchApp请求API时出现Bad request错误如何解决
UrlFetchApp请求API返回Bad Request 排查方案
已定位的显性问题
- 格式错误:Authorization请求头中
Bearer和access token之间存在2个空格,不符合OAuth 2.0的标准头格式,服务端解析token时会直接判定请求无效,返回400错误。标准格式要求Bearer与token之间仅保留1个半角空格。 - 逻辑冗余:代码在权限校验前就提前打印授权地址和token,未授权场景下会打印无效值,干扰排查。
- 缺少异常判断:拿到响应后未校验HTTP状态码直接解析JSON,请求失败时无法定位具体错误原因。
- 缺少必要请求头:未显式声明
Accept头,部分后端框架会校验该字段,未匹配要求的返回格式时会直接拒绝请求。
其他潜在触发原因
- access token本身无效:存在过期、授权scope不覆盖目标接口、token被吊销等情况,即使
service.hasAccess()返回true,也可能因为token缓存问题拿到无效值。 - 接口缺少必填参数:目标
/get_graph_data接口为GET请求,若要求必传查询参数(如时间范围、数据维度、节点ID等),未携带时会返回Bad Request。 - 重定向异常:自动跟随重定向时如果丢失Authorization头,跳转到鉴权地址也会返回400错误。
修复后代码
function run() { const service = getOAuthService(); // 优先判断权限,未授权直接输出授权地址终止执行 if (!service.hasAccess()) { const authorizationUrl = service.getAuthorizationUrl(); Logger.log(`打开以下URL完成授权后重新运行脚本: ${authorizationUrl}`); return; } const accessToken = service.getAccessToken(); Logger.log("当前使用的access token:", accessToken); const url = 'https://ffa-int-service-lnhtqfum-zgvbwhku.apps.dev.aro.forgeapp.honeywell.com/get_graph_data'; const options = { method: 'GET', headers: { // 修复Bearer后多余空格问题,补充Accept头 'Authorization': `Bearer ${accessToken}`, 'Accept': 'application/json' }, muteHttpExceptions: true, followRedirects: true }; const response = UrlFetchApp.fetch(url, options); const responseCode = response.getResponseCode(); const responseText = response.getContentText(); // 先判断状态码再处理结果 if (responseCode >= 400) { Logger.log(`请求失败,状态码: ${responseCode},服务端返回: ${responseText}`); return; } const result = JSON.parse(responseText); Logger.log("请求成功,返回数据:", JSON.stringify(result, null, 2)); }
后续排查步骤
如果替换代码后仍报错,按以下顺序排查:
- 核对接口文档,确认GET请求需要的所有查询参数,将参数按
key=value格式拼接到URL末尾,多个参数用&连接 - 单独拷贝日志中打印的access token,用接口调试工具直接请求接口,确认token本身是否有效
- 暂时将
followRedirects设为false,打印响应头的Location字段,确认是否存在重定向丢头的问题 - 临时关闭
muteHttpExceptions(设为false),查看脚本运行时抛出的完整错误栈,获取服务端返回的具体错误字段
内容的提问来源于stack exchange,提问作者Sumedh Bhagat
相关产品推荐
相关产品推荐

