仅在 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.
我正在尝试设置一个 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.