将可用AJAX POST请求转为UrlFetchApp时遇400错误求助
排查与修正Google Apps Script调用Infobip API的400错误
核心排查步骤
对比请求体差异
- 在原jQuery代码中,用
console.log(JSON.stringify(yourDataObject))输出请求体字符串并保存。 - 在Google Apps Script中,用
Logger.log(JSON.stringify(yourPayloadObject))输出对应字符串,与前者逐字符对比,重点检查:- 字段名拼写是否完全一致(比如
destinationsvsdestination) - 数据类型是否匹配(比如手机号是否为字符串、数字是否被误转成字符串)
- 数组/对象结构是否正确(比如
messages是否为数组,每个消息项的嵌套结构是否符合要求)
- 字段名拼写是否完全一致(比如
- 在原jQuery代码中,用
检查请求头与配置
UrlFetchApp默认行为和jQuery不同,必须显式配置以下项:- 强制设置
Content-Type为application/json,否则请求体会被自动编码为form-urlencoded,导致API无法解析。 - 确保
Authorization头格式正确:App YOUR_API_KEY(注意App后有空格)。 - 开启
muteHttpExceptions: true,这样即使返回400错误,也能获取完整的响应正文,查看API给出的具体错误提示(比如哪个字段非法)。
- 强制设置
验证JSON格式合法性
把GAS生成的JSON字符串复制到JSON校验工具中检查,确认没有语法错误:- 无遗漏的逗号或多余的末尾逗号(部分API对末尾逗号兼容性差)
- 所有字符串用双引号包裹(JSON不允许单引号)
- 特殊字符(如换行、引号)已正确转义
修正后的示例代码
假设原jQuery请求能正常运行,对应的GAS代码应该如下:
function sendInfobipSMS() { const apiUrl = "https://api.infobip.com/sms/2/text/advanced"; const apiKey = "你的API密钥"; // 与jQuery中完全一致的请求体结构 const payload = { messages: [ { from: "InfoSMS", destinations: [{ to: "目标手机号" }], text: "测试短信内容" } ] }; const options = { method: "POST", headers: { "Authorization": `App ${apiKey}`, "Content-Type": "application/json" }, payload: JSON.stringify(payload), muteHttpExceptions: true }; const response = UrlFetchApp.fetch(apiUrl, options); // 打印响应信息用于排查 Logger.log(`响应状态码: ${response.getResponseCode()}`); Logger.log(`响应内容: ${response.getContentText()}`); }
额外注意事项
- 如果API返回的错误提示指向某个字段,比如
"from" field is invalid,请对照Infobip官方文档检查该字段的格式限制(比如长度、允许的字符)。 - 部分情况下,GAS的
JSON.stringify处理特殊字符的方式和浏览器略有差异,可手动调整字符串转义逻辑(比如对特殊字符提前处理)。
内容的提问来源于stack exchange,提问作者Barth
相关产品推荐
相关产品推荐

