仅在 google 应用程序脚本中获取请求失败

Fetch request failing in google apps script ONLY

我正在尝试设置一个 google 聊天应用程序来向我的服务器发送信息,但是我 运行 遇到了一个问题,即仅在使用 [=22] 时请求失败并出现 464 错误=] 应用程序脚本。 运行 在浏览器中使用 axios 或 fetch,或者使用我自己的客户端,或者使用 postman 的请求,同样的请求在 100% 的时间内都可以正常工作。但是,一旦我从 google 应用程序脚本发出此请求,它就会产生 464,我无法弄清楚为什么。

代码本身非常简单,它在 google 脚本中:

const response = UrlFetchApp.fetch('https://dev-core.kalosflorida.com/v1/trelloslackbot', 
{ 
  method: "GET",
  followRedirects: true, 
  muteHttpExceptions: true
})

和标准 javascript

fetch('https://dev-core.kalosflorida.com/v1/trelloslackbot')
  .then(res => console.log(res))
  .catch(err => console.error(err))

我看不出这两个示例之间有什么区别,但是 google 脚本版本总是在我的负载平衡器上失败并出现 464 错误。

错误在亚马逊的troubleshooting guide:

中有解释

HTTP 464 The load balancer received an incoming request protocol that is incompatible with the version config of the target group protocol.

Possible causes:

  • The request protocol is an HTTP/1.1, while the target group protocol version is a gRPC or HTTP/2.
  • The request protocol is a gRPC, while the target group protocol version is an HTTP/1.1.
  • The request protocol is an HTTP/2 and the request is not POST, while target group protocol version is a gRPC.

在你的情况下,问题似乎是第一个。您的负载均衡器的目标组协议是 HTTP/2,而 Apps 脚本发送 HTTP/1.1 请求。

您可以使用 HTTP2.Pro API 进行测试:

function test() {
  const response = UrlFetchApp.fetch('https://http2.pro/api/v1')
  console.log(response.toString())
}

此 API returns 用作 JSON 字符串的协议。在 Apps 脚本中,响应是这样的:

{
   "http2":0,
   "protocol":"HTTP\/1.1",
   "push":0,
   "user_agent":"Mozilla\/5.0 (compatible; Google-Apps-Script; beanserver; +https:\/\/script.google.com; id: [...])"
}

同时在浏览器中使用 Javascript 访问端点或仅输入 URL 将 return 以下内容:

{
   "http2":1,
   "protocol":"HTTP\/2.0",
   "push":1,
   "user_agent":"Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/100.0.4896.127 Safari\/537.36"
}

如您所见,Google 的 Apps 脚本服务器发送 HTTP/1.1 请求,而您的浏览器将使用 HTTP/2。我检查了 UrlFetchApp documentation and it doesn't look like there's a way to change the protocol used by Apps Script so you may have to configure your load balancer's target groups to use HTTP/1.1 instead. Amazon has some relevant documentation here.