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

将可用AJAX POST请求转为UrlFetchApp时遇400错误求助

排查与修正Google Apps Script调用Infobip API的400错误

核心排查步骤

  • 对比请求体差异

    1. 在原jQuery代码中,用console.log(JSON.stringify(yourDataObject))输出请求体字符串并保存。
    2. 在Google Apps Script中,用Logger.log(JSON.stringify(yourPayloadObject))输出对应字符串,与前者逐字符对比,重点检查:
      • 字段名拼写是否完全一致(比如destinations vs destination)
      • 数据类型是否匹配(比如手机号是否为字符串、数字是否被误转成字符串)
      • 数组/对象结构是否正确(比如messages是否为数组,每个消息项的嵌套结构是否符合要求)
  • 检查请求头与配置
    UrlFetchApp默认行为和jQuery不同,必须显式配置以下项:

    1. 强制设置Content-Type为application/json,否则请求体会被自动编码为form-urlencoded,导致API无法解析。
    2. 确保Authorization头格式正确:App YOUR_API_KEY(注意App后有空格)。
    3. 开启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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 01:55:13