Python代码转Google Apps Script(GAS)执行报Bad Request错误如何解决
问题原因及解决方法
核心错误原因
- 请求头未匹配Python原版逻辑:Python使用
requests的data参数传空字典时,默认会自动添加Content-Type: application/x-www-form-urlencoded请求头,你的两版GAS代码均未显式指定该请求头,导致API无法识别请求格式 - payload格式错误:第一版GAS将空对象转为JSON字符串传递,相当于发送JSON格式请求,和原Python逻辑不符;第二版直接传递空JS对象,GAS会默认将其封装为
multipart/form-data格式,同样和原请求格式不匹配 - 调试逻辑不合理:你虽然开启了
muteHttpExceptions参数,但没有先打印原始响应状态码和返回内容,直接执行JSON解析,无法拿到API返回的具体错误提示
修正后的GAS代码
function sending() { var requestId = "*************************"; var STAGING_KEY = "abcdefghijklmn"; var url = "http://myapi/internal/ocr/" + requestId + "/ng"; // 和原Python逻辑一致,传空字符串作为payload var payload = ""; var options = { 'muteHttpExceptions': true, 'method': 'post', 'payload': payload, 'headers': { 'X-Authorization': STAGING_KEY, // 显式指定和Python请求一致的Content-Type 'Content-Type': 'application/x-www-form-urlencoded' } }; try { var response = UrlFetchApp.fetch(url, options); // 先打印状态码和原始返回内容,方便后续排查问题 Logger.log("响应状态码:" + response.getResponseCode()); Logger.log("原始返回内容:" + response.getContentText()); var result = JSON.parse(response.getContentText()); if (result && result["id"]) { return 'sent'; } else { Logger.log('error1: 返回结果无id字段'); } } catch (e) { Logger.log('error2: ' + e.toString()); } }
额外排查建议
- 如果修改后还是报错,可以提取日志里的状态码和返回内容分析,通常400 Bad Request会伴随具体的错误说明,比如参数缺失、签名错误、请求格式不对等
- 确认你的GAS运行环境可以正常访问该内网API,部分内网接口会限制访问来源IP,Google Apps Script的出口IP是谷歌的服务器IP,可能会被内网防火墙拦截
内容的提问来源于stack exchange,提问作者Aoki SJ Seonok Yang
相关产品推荐
相关产品推荐

