您可以使用 Java 标准库中的 java.net.URLConnection,通过 Java 应用程序创建 HTTP 和 HTTPS 连接。App Engine 使用网址抓取服务实现该接口。
有关 java.net 的详细信息,请参阅 Sun 的 java.net.URLConnection 文档。
获取某网址的页面内容的一种简单方法是创建 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,视网址而定)。在发出请求之前,您可以用更多信息准备此对象。要进行请求,请调用 URLConnection 上的方法,如 getInputStream() 或 getOutputStream()。
App Engine 的 URLConnection 实现不会与远程主机保持永久连接。当应用程序设置请求数据或写入输出流时,请求数据保存在内存中。当应用程序访问有关响应的任何数据时,如获得输入流(或调用 connect() 方法),App Engine 通过请求数据调用网址抓取服务,获得响应,关闭连接并返回响应数据。
以下示例通过某些表单数据对网址发出 HTTP POST 请求。
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.io.OutputStreamWriter;
// ...
String message = URLEncoder.encode("my message", "UTF-8");
try {
URL url = new URL("http://www.example.com/comment");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setDoOutput(true);
connection.setRequestMethod("POST");
OutputStreamWriter writer = new OutputStreamWriter(connection.getOutputStream());
writer.write("message=" + message);
writer.close();
if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {
// OK
} else {
// Server returned HTTP error code.
}
} catch (MalformedURLException e) {
// ...
} catch (IOException e) {
// ...
}
要在传出请求上设置 HTTP 标头,请调用 HttpURLConnection 的 setRequestProperty() 方法。
connection.setRequestProperty("X-MyApp-Version", "2.7.3");
默认情况下,HttpURLConnection 将遵循 HTTP 重定向。网址抓取服务将遵循最多 5 个重定向。
要禁用以下重定向,请调用 HttpURLConnection 的 setFollowRedirects() 方法。
connection.setFollowRedirects(false);
网址抓取服务不支持永久 HTTP 连接。当应用程序使用 URLConnection 对象访问响应数据时,App Engine 调用网址抓取服务来完成请求。在访问了响应数据之后,无法修改请求数据。
应用程序无法为请求设置显式连接超时。
网址抓取服务限制了传出请求和传入响应的数据大小。使用 java.net API 时,将在不进行提示的情况下截断大于该限制的数据。通过低级网址抓取 API,可指定是否在不进行提示的情况下进行截断,或者在超出限制的情况下是否引发异常。