http://code.google.com/intl/zh-CN/appengine/docs/java/urlfetch/usingjavanet.html
App Engine 应用程序可以与其他应用程序进行通信或通过抓取网址访问网络上的其他资源。应用程序可以使用网址抓取服务来发出 HTTP 和 HTTPS 请求并接收响应。出于效率和扩展性考虑,网址抓取服务使用 Google 的网络基础结构。
您可以使用 Java 标准库中的 java.net.URLConnection 和相关类,通过 Java 应用程序创建 HTTP 和 HTTPS 连接。App Engine 使用网址抓取服务实现此接口;您的应用程序没有直接创建套接字连接。
获取某网址的页面内容的一种简单方法是创建 java.net.URL 对象,然后调用其 openStream()
方法。该方法可处理创建连接的详情,发出 HTTP GET 请求,然后检索响应数据。
import java.net.MalformedURLException; import java.net.URL; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.IOException; // ... try { URL url = new URL("http://www.example.com/atom.xml"); BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream())); String line; while ((line = reader.readLine()) != null) { // ... } reader.close(); } catch (MalformedURLException e) { // ... } catch (IOException e) { // ... }
对于更复杂的请求,您可以调用网址对象的 openConnection()
方法以获取 URLConnection 对象(HttpURLConnection 或 HttpsURLConnection,视网址而定)。在发出请求之前,您可以用更多信息准备此对象。请参阅使用 java.net。
应用程序可以使用 HTTP(正常)或 HTTPS(安全)抓取网址。网址指定要使用的方案:http://...
或 https://...
网址必须使用标准的 HTTP (80) 和 HTTPS (443) 端口。端口由方案所暗示,但是只要端口对于方案是标准的,那么也可以在网址中提及 (https://...:443/
)。应用程序不能连接到远程主机的任意端口,也不能使用方案的非标准端口。
可以使用以下任何 HTTP 方法来抓取:GET
(常用于请求网页和数据)、POST
(常用于提交网络表单)、PUT
、HEAD
和 DELETE
。抓取可以包含 HTTP 请求标头和有效负载(HTTP 请求正文)。
网址抓取服务使用 HTTP/1.1 兼容代理来抓取结果。
为了防止应用程序造成请求的无限循环,不允许请求处理程序抓取其自身的网址。但其他做法仍然有可能造成无限循环,所以如果应用程序能够抓取由用户提供的对网址的请求,就要非常小心。
对网址抓取服务的调用是同步的,并且在服务接收来自远程主机的响应之前不会返回。应用程序的请求计时器可能会在远程主机作出响应之前走完。请求一旦发出便无法取消。
应用程序可以利用 HTTPS 方法来抓取网址,以连接到安全的服务器。请求和响应数据以加密形式在网络上进行传输。
网址抓取服务所使用的代理不能对其所联系的主机进行验证。因为不存在证书信任链,所以代理接受所有证书,包括自签名证书。使用 HTTPS 时,代理服务器不能检测到 App Engine 和远程主机之间的“中间人”攻击。
应用程序可以为传出请求设置 HTTP 标头。
当发送 HTTP POST 请求时,如果未明确设置 Content-Type
标头,则标头会被设置为 x-www-form-urlencoded
。这是网络表单使用的内容类型。
出于安全性考虑,应用程序不能修改以下标头:
Content-Length
Host
Referer
Vary
Via
X-Forwarded-For
根据情况,由 App Engine 将这些标头设置为准确的值。例如,App Engine 通过请求数据计算 Content-Length
标头,并在发送之前将其添加到请求。
网址抓取服务返回所有响应数据,包括响应代码、标头和正文。
默认情况下,如果网址抓取服务收到带有重定向代码的响应,服务将跟随重定向。服务将跟随最多 5 个重定向响应,然后返回最终资源。您可以使用 API 通知网址抓取不要跟随重定向,只返回对应用程序的重定向响应。
默认情况下,如果传入响应超过最大响应大小限制,则截断响应。当响应超过最大大小时,您可以使用 API 来使服务引发异常。(有关此限制的值,请参阅下文。)
使用 Google 安全数据连接器 (SDC) 可以将您的应用程序连接到公司防火墙之后的系统。通过在网络上设置的 SDC 代理,在 Google 企业应用套件域上运行的 App Engine 应用程序可以验证代理并访问 Intranet 上的网址。SDC 代理将确保只有您的应用程序能够连接到 Intranet,并且确保只有使用 Google 企业应用套件帐户登录到域上的用户才可以执行此操作。
您的应用程序可以使用网址抓取服务来访问 Intranet 网址。应用程序包含特殊的标头,其请求声明该请求是针对 SDC 代理的。标头的名称为 use_intranet
,值为 yes
。不需要其他更改;自动处理用户验证、验证和安全连接。
以下是如何通过 java.net.HttpURLConnection 接口将网址抓取与 use_intranet
标头配合使用的示例:
import java.net.HttpURLConnection; import java.net.URL; // ... URL url = new URL("http://www.corp.example.com/sales.csv"); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestProperty("use_intranet", "true");
有关更多信息,请参阅 Google 安全数据连接器网站。
当应用程序在计算机上的开发服务器中运行时,将在本地处理对网址抓取服务的调用。开发服务器使用计算机用来访问互联网的任何网络配置,通过直接从计算机联系远程主机来抓取网址。
测试抓取网址的应用程序的功能时,请确保计算机可以访问远程主机。
如果应用程序在 Intranet 上使用 Google 安全数据连接器来访问网址,请确保在连接到防火墙后面的 Intranet 时测试应用程序。与 App Engine 不同的是,开发服务器不使用 SDC 代理来解析 Intranet 网址。只有 Google 企业应用套件和 App Engine 才可以验证 SDC 代理。
每个网址抓取请求都会计算在网址抓取 API 调用配额内。
使用网址抓取服务在 HTTP 或 HTTPS 请求中发送的数据都会计算在以下配额内:
除了这些配额以外,在 HTTPS 请求中发送的数据也会计算在以下配额内:
使用网址抓取服务在对 HTTP 或 HTTPS 请求的响应中所接收的数据都会计算在以下配额内:
除了这些配额以外,在对 HTTPS 请求的响应中接收的数据也会计算在以下配额内:
有关配额的详细信息,请参阅配额,以及管理控制台的“配额详细信息”部分。
除了配额以外,使用网址抓取服务还需遵循以下限制:
限制 | 值 |
---|---|
请求大小 | 1 兆字节 |
响应大小 | 1 兆字节 |