如何向 Google Apps Script Web App 发送有效的 HTTP 请求?

Posted

技术标签:

【中文标题】如何向 Google Apps Script Web App 发送有效的 HTTP 请求?【英文标题】:How to send a valid HTTP request to a Google Apps Script Web App? 【发布时间】:2021-02-03 18:17:47 【问题描述】:

我们从 C++ 应用程序 (Arduino Sketck) 向 Google 应用脚本网络应用程序 发送了一个 HTTP 请求,但我们得到了 HTTP 响应:HTTP/1.1 302 Moved Temporarily。带有 http 请求的 url 在浏览器中可以正常工作。

相同的代码也适用于其他网站,例如www.google.com。不要使用 script.google.com。

Google Apps 脚本发布的网络应用程序是公开的,任何人甚至匿名都可以访问:

这里是我们使用的代码

    client.println("GET /macros/s/AKfycbyQnmHekk4_NNy3Bl5ILzuSRkykMWaXQ7Rtojk7fFieDUbVqNM/exec?valore=7 HTTP/1.1");
    client.println("Host: script.google.com");
    client.println("Connection: close");
    client.println();

答案是:


    HTTP/1.1 301 Moved Permanently
    Content-Type: text/html; charset=UTF-8
    Cache-Control: no-cache, no-store, max-age=0, must-revalidate
    Pragma: no-cache
    Expires: Mon, 01 Jan 1990 00:00:00 GMT
    Date: Wed, 03 Feb 2021 09:29:02 GMT
    Location: https://script.google.com/macros/s/AKfycbyQnmHekk4_NNy3Bl5ILzuSRkykMWaXQ7Rtojk7fFieDUbVqNM/exec?valore=7
    X-Content-Type-Options: nosniff
    X-Frame-Options: SAMEORIGIN
    Content-Security-Policy: frame-ancestors 'self'
    X-XSS-Protection: 1; mode=block
    Server: GSE
    Accept-Ranges: none
    Vary: Accept-Encoding
    Connection: close
    Transfer-Encoding: chunked
    11e
    <HTML>
    <HEAD>
    <TITLE>Moved Permanently</TITLE>
    </HEAD>
    <BODY BGCOLOR="#FFFFFF" TEXT="#000000">
    <H1>Moved Permanently</H1>
    The document has moved <A HREF="https://script.google.com/macros/s/AKfycbyQnmHekk4_NNy3Bl5ILzuSRkykMWaXQ7Rtojk7fFieDUbVqNM/exec?valore=7">here</A>.
    </BODY>
    </HTML>
    0
    disconnecting from server.

网址正确( http://script.google.com/macros/s/AKfycbyQnmHekk4_NNy3Bl5ILzuSRkykMWaXQ7Rtojk7fFieDUbVqNM/exec?valore=7) 但似乎谷歌应用程序脚本网络应用程序将请求重定向(到相同的 url,使用 https 协议)。

使用相同的代码,我们从 Arduino 发出了其他 HTTP 请求,并且运行良好。 例如我们做了:

    client.println("GET /search?q=arduino HTTP/1.1");
    client.println("Host: www.google.com");
    client.println("Connection: close");
    client.println();

我们得到了响应 ``HTTP/1.1 200 OK ```,并且 html 响应包含根据查询 q=arduino 的搜索结果

关于我们如何向 Google Apps 脚本网络应用发送有效的 http/https 请求有什么建议吗?

谢谢。

【问题讨论】:

【参考方案1】:

如您所见,Google 脚本应用程序将您从 HTTP 重定向到 HTTPS。一些谷歌网站可以通过 HTTP 访问,如果他们不想,他们不必重定向到 HTTPS。在您的示例中,http://www.google.com/search?q=arduino 确实重定向到 https://www.google.com/search?q=arduino&gws_rd=ssl。但是,您的客户端没有在请求中发送 User-Agent 标头,因此 Google 知道您的客户端不是浏览器,并且在您的情况下可能不会发出重定向。但在真正的浏览器中,确实如此。

将 URL http://script.google.com/macros/s/AKfycbyQnmHekk4_NNy3Bl5ILzuSRkykMWaXQ7Rtojk7fFieDUbVqNM/exec?valore=7 放入浏览器会重定向到 https://script.google.com/macros/s/AKfycbyQnmHekk4_NNy3Bl5ILzuSRkykMWaXQ7Rtojk7fFieDUbVqNM/exec?valore=7。真正的浏览器会自动跟随该重定向,用户甚至可能不会注意到其中的差异。

但是您的客户必须手动进行重定向。这意味着从响应中提取 Location 标头,关闭现有连接(到端口 80 上的 script.google.com),连接到指定服务器(端口 443 上的 script.google.com),并使用最终发送 HTTP 请求之前的服务器。

SSL/TLS 很复杂,HTTP 有很多规则。不要尝试手动实现它们。最好使用内置 HTTPS 支持的现有 HTTP 库。让它为您处理所有这些细节。

【讨论】:

以上是关于如何向 Google Apps Script Web App 发送有效的 HTTP 请求?的主要内容,如果未能解决你的问题,请参考以下文章

将身份验证从一个 Google Apps Script webapp 传递到另一个 Google Apps Script webapp

允许匿名访问 Google Apps Script Web 应用程序(Google Apps 帐户)

该脚本工作正常,但不在“google-apps-script”中

Google-apps-script 函数 CHAR() 和 CODE()

Google-Apps-Script 无法使用 getDataRange().setValues() 写回数据库

如何使用 Google Apps 脚本执行 API + Java 创建 Google 表单?