本页面介绍了 App Engine 应用如何发出 HTTP 和 HTTPS 请求和接收响应。如需通过查看代码示例来了解如何从 App Engine 应用发出 HTTP 和 HTTPS 请求,请参阅发出 HTTP(S) 请求。
请求
在 App Engine Java 8 运行时中,您可以使用java.net.URLConnection
抽象类以及 Java 标准库中的相关类,从 Java 应用建立 HTTP 和 HTTPS 连接。
或者,您也可以使用 App Engine URL Fetch API,通过 URL Fetch API 实现 URLConnection
中定义的方法。如需了解使用原生 Java 类与使用 URL Fetch API 的对比情况,请参阅在 Java 8 中使用标准 Java 调用(而非 URL Fetch)的好处。
请求协议
应用可以使用 HTTP 或 HTTPS 提取网址。通过查看目标网址中的协议,可以推断具体应使用哪种协议。
需要提取的网址可以使用以下范围内的任意端口号:
80
-90
440
-450
1024
-65535
如果网址中未提及端口,则使用协议默认的端口。HTTP 请求使用端口 80
,而 HTTPS 请求使用端口 443
。
请求方法
如果您通过标准 Javajava.net.URLConnection
类发出请求,则可以使用任何受支持的 HTTP 方法。
如果通过 URL Fetch 服务发出请求,则可以使用以下任意一种 HTTP 方法:
GET
POST
PUT
HEAD
DELETE
PATCH
请求可以包含 HTTP 标头,对于 POST
、PUT
和 PATCH
请求,还可以包含负载。
请求代理
请注意,URL Fetch 服务使用符合 HTTP/1.1 规范的代理来提取结果。
为了防止应用造成请求无限递归的情况,不允许请求处理程序提取自己的网址。由于使用其他方法也可能导致无限递归,因此,请谨慎决定是否允许您的应用为用户提供的网址提取请求。
请求标头
您的应用可以为传出请求设置 HTTP 标头。
发送 HTTP POST
请求时,如果用户未明确设置 Content-Type
标头,系统会将标头设置为 x-www-form-urlencoded
。这是 Web 表单使用的内容类型。
出于安全考虑,应用无法修改以下标头:
Content-Length
Host
Vary
Via
X-Appengine-Inbound-Appid
X-Forwarded-For
X-ProxyUser-IP
App Engine 会根据具体情况将这些标头设置为准确的值。例如,App Engine 通过请求数据计算 Content-Length
标头,并在发送之前将其添加到请求中。
下列标头会标明发出请求的应用的 ID:
User-Agent
。此标头可以修改,但 App Engine 将附加一个标识符字符串,以使服务器能够识别 App Engine 请求。附加的字符串格式为"AppEngine-Google; (+http://code.google.com/appengine; appid: APPID)"
,其中APPID
是应用的标识符。X-Appengine-Inbound-Appid
。此标头无法修改,如果遵循重定向参数设置为False
,则通过 URL Fetch 服务发送请求时会自动添加此标头。
请求超时
您可以为请求设置截止时限或超时。默认情况下,请求的超时为 10 秒。HTTP(S) 请求的截止时限是 60 秒,任务队列和 Cron 作业请求的截止时限同样也是 60 秒。当使用 URL Fetch 的 URLConnection
抽象类时,该服务使用连接超时 (setConnectTimeout()
) 和读取超时 (setReadTimeout()
) 作为截止时限。
您可以发送同步请求和异步请求。以下行为适用于 URL Fetch API:
- 同步请求:提取调用一直等到远程主机返回结果,然后将控制权交还给应用。如果超过了提取调用的最长等待时间,则该调用引发异常。
- 异步请求:URL Fetch 服务启动请求,然后立即返回一个对象。应用可以在提取网址的同时执行其他任务。应用需要结果时,将针对该对象调用一个方法,该方法等待请求完成(如有必要),然后返回结果。在请求处理程序退出时,如果任何 URL Fetch 请求处于未完成状态,应用服务器将等待所有剩余请求返回或到达截止时间,然后再向用户返回响应。
安全连接和 HTTPS
通过使用 HTTPS 连接到安全服务器,您的应用可以安全地提取网址。同时,请求和响应数据会以加密形式在网络中传输。
如果您使用的是 URL Fetch API,请注意 URL Fetch 代理不会验证其正在连接的主机。在使用 HTTPS 时,代理服务器无法检测 App Engine 和远程主机之间的中间人攻击。此时您可以使用 URLFetchService
API 中的 FetchOptions
类来启用主机验证。
响应
如果您使用的是 URL Fetch API,那么请注意,URL Fetch 服务将返回所有响应数据,包括响应、代码、标头和正文。
默认情况下,如果 URL Fetch 服务收到包含重定向代码的响应,该服务将进行重定向。服务最多遵循五个重定向响应,然后返回最终资源。您可以指示 URL Fetch 服务不遵循重定向,而是返回应用的重定向响应。
在开发服务器上使用 URL Fetch
当您的应用在计算机的 App Engine 开发服务器上运行时,对 URL Fetch 服务的调用将在本地处理。开发服务器使用您的计算机用于访问互联网的任何网络配置,直接从您的计算机连接到远程主机以提取网址。
在测试提取网址的应用功能时,请确保您的计算机可以访问远程主机。
URL Fetch 的配额和限制
对于 Java 运行时,您可以使用标准 Javajava.net.URLConnection
API,而非 URLFetch(以下配额和限制注意事项不适用于 URLFetch)。
如需了解 URL Fetch 服务配额,请参阅配额。如需查看应用的当前配额使用情况,请前往 Google Cloud Console 中的“配额详情”页面。
此外,使用 URL Fetch 服务时存在以下限制:
限制 | 数量 |
---|---|
请求大小 | 10 MB |
请求标头大小 | 16 KB(请注意,这将限制可在标头中指定的网址的最大长度) |
响应大小 | 32 MB |
截止时限(请求处理程序) | 60 秒 |
截止时限(任务队列和 Cron 作业处理程序) | 60 秒 |
后续步骤
运行代码示例,并参阅发出 HTTP(S) 请求,获取有关如何从应用发出请求的指导。