Google Apps 脚本 UrlFetchApp.fetch 将整数转换为浮点数?

Google Apps Script UrlFetchApp.fetch converts integers to floats?

我正在编写一个 Google 应用程序脚本,它使用 UrlFetchApp

访问几个 APIs

我的一个 API POST 请求需要负载中的整数值,但是 UrlFetchApp.fetch 将整数值(即 0)更改为浮点数(即 0.0)

我的选项看起来像这样:

const options = { method: 'POST', headers: {...}, payload: { someStringA: "foo", someStringB: "bar", App: 0 } }

并且从 API 返回的错误信息是:

{"message":"The request is invalid.","modelState":{"request.App":["The value '0.0' is not valid for App.","The App field is required."]}}

UrlFetchApp.fetch 已将我的 App 值:0 转换为:0.0,此 API 端点不接受。

我尝试将请求值强制为字符串“0”,但是 API 不接受 属性 的字符串类型。

有人知道解决这个问题的方法吗?我如何告诉 UrlFetchApp.fetch 保持整数值“原样”而不将它们转换为浮点数?

ps。同样的请求对我来说可以通过 cURL 像这样工作:

curl --location --request POST "https://$url" \
    --header 'Content-Type: application/json' \
    --header "Authorization: Bearer $token" \
    --data "{\"someStringA\":\"$foo\",\"someStringB\":\"$bar\",\"app\":0}"

提前感谢您的帮助

更新:抱歉,这里的问题毕竟不是 UrlFetchApp。我的问题是从 api 返回的响应是一个空对象,我试图像这样记录它:JSON.parse(response);导致提到的错误。

根据您的问题,很遗憾,我不确定您要使用的 API 的规格、您的请求 header 以及您确认的 curl 命令。所以我想提出以下修改模式作为我的猜测。

发件人:

const options = { method: 'POST', headers: {...}, payload: { someStringA: "foo", someStringB: "bar", App: 0 } }

收件人:模式 1

const options = { method: 'POST', headers: {...}, contentType: "application/json", payload: JSON.stringify({ someStringA: "foo", someStringB: "bar", App: 0 }) };
  • 在这种情况下,数据发送为 JSON。
  • 如果您在 headers 中使用 Content-Type,请将其删除。

收件人:模式 2

const options = { method: 'POST', headers: {...}, payload: JSON.stringify({ someStringA: "foo", someStringB: "bar", App: 0 }) };
  • 在这种情况下,数据作为字符串值的表单数据发送。

收件人:模式 3

const options = { method: 'POST', headers: {...}, payload: { someStringA: "foo", someStringB: "bar", App: "0" } };
  • 在这种情况下,"0" 在解析数据中作为表单数据的字符串值发送。

注:

  • 如果以上修改方式不能解决您的问题,能否提供您确认的示例curl命令?至此,我想修改我的答案。

参考:

已添加:

从您的 curl 命令中,我了解到我的模式 1 与您的 curl 命令是相同的请求。但不幸的是,从你的回复 Unexpected end of JSON input 来看,虽然我不确定你当前的脚本是否使用我的模式 1,但当你的 curl 命令转换为 Google Apps 脚本时,它变成如下。你能再测试一下吗?

const token = "###";  // Please use your token.
const data = { someStringA: "foo", someStringB: "bar", App: 0 };
const options = {
  method: 'POST',
  headers: { Authorization: `Bearer ${token}` },
  contentType: "application/json",
  payload: JSON.stringify(data)
};
const res = UrlFetchApp.fetch("your URL", options);
console.log(res.getContentText())