繁体   English   中英

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

[英]Fetch request failing in google apps script ONLY

我正在尝试设置一个将信息发送到我的服务器的谷歌聊天应用程序,但是我遇到了一个问题,即仅在使用 Google Apps 脚本时请求失败并出现 464 错误。 使用 axios 或 fetch,或使用我自己的客户端,或使用 postman 在浏览器中运行请求,同样的请求在 100% 的时间内都有效。 但是一旦我从谷歌应用程序脚本发出这个请求,它就会产生 464,我无法弄清楚为什么。

代码本身在谷歌脚本中非常简单:

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))

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

亚马逊的故障排除指南中解释了该错误:

HTTP 464 负载平衡器收到与目标组协议的版本配置不兼容的传入请求协议。

可能的原因:

  • 请求协议是 HTTP/1.1,而目标组协议版本是 gRPC 或 HTTP/2。
  • 请求协议是 gRPC,而目标组协议版本是 HTTP/1.1。
  • 请求协议是 HTTP/2,请求不是 POST,而目标组协议版本是 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 返回用作 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 将返回以下内容:

{
   "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文档,看起来没有办法更改 Apps 脚本使用的协议,因此您可能必须将负载均衡器的目标组配置为使用HTTP/1.1 亚马逊在这里有一些相关文档。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM