2007 年 6 月
简介:为什么要使用代理?
代理服务器是一台计算机(或计算机上的服务),代表其对多个客户端计算机发出请求(通常是向外部资源发出请求)。本文涉及 HTTP 代理服务器,因为 HTTP 是用于访问 Google 网络服务的公共 API 的协议。而且,HTTPS 或 SSL 代理在发出包含私密用户数据或密码等敏感信息的 HTTP 请求时也会受到关注。如今,许多大型公司都使用 HTTP 代理来控制员工可以在互联网上查看哪些网站或信息。众所周知,公共图书馆和学校会出于上述目的实现代理。此外,还有许多公开提供的代理服务器可用于匿名访问网页内容。
使用代理服务器时可能会遇到的潜在问题取决于所使用的软件及其配置方式。如果代理未以代理识别和身份验证所必需的任何方式改变来自客户端或服务器的响应,则会被视为“透明”。不过,如果有大量代理服务器改变了请求或响应,开发者应该知道这一点。具体而言,某些代理会更改响应的内容类型,或剥离将 HTTP keep-alive 标头发送到托管该资源的外部服务器。
那么,开发者为什么要使用 HTTP 或 SSL 代理呢?通常,这样做有两个原因:某些公司基础架构需要此权限,或者开发者希望调试使用网络服务的应用。第一个原因完全是不可避免的:后一个问题经常出现在我们的支持论坛中,这是开发者尝试处理 Google 网络服务时遇到的问题。有一些特殊“调试”代理(如 Fiddler 和 Charles)正是针对这种情况。如需详细了解如何使用代理服务器,请参阅在线:API 开发者工具一文。
对于某些应用,添加代理服务器支持可能会很困难。幸运的是,进行一些细微的代码修改后,Google Data API 的大多数客户端库都可以与 HTTP 代理服务器配合使用。本文面向的是准备使用代理服务器来处理其应用发出的 Web 请求的开发者。
Java
由于 Sun 使用系统属性来管理连接设置,因此可以轻松将 HTTP 代理与 Java 客户端库配合使用。
例如,如果您的公司代理服务器是在“my.proxy.domain.com”的端口 3128 上运行的,那么您可以先向代码中添加以下内容,然后再为 Google 日历、Google 电子表格等创建服务对象。
System.setProperty("http.proxyHost", "my.proxy.domain.com"); System.setProperty("http.proxyPort", "3128");
或者,您也可以在启动 servlet 环境时通过命令行执行此操作:
java -Dhttp.proxyHost=my.proxy.domain.com -Dhttp.proxyPort=3128
借助较新版本的 JSSE 软件包,也可以将其扩展到 SSL 代理。如果上例中的同一代理服务器在端口 3129 上运行 SSL 代理,则必需的代码为:
System.setProperty("https.proxyHost", "my.proxy.domain.com"); System.setProperty("https.proxyPort", "3129");
您也可以在命令行中采用与 HTTP 代理相同的方式完成此操作。
有时,您可能需要向代理服务器提供凭据才能使用该工具。通常情况下,提交的方式是使用 HTTP 标头中包含的 base64 哈希值,如下所示:
String encoded = new String(Base64.encodeBase64(new String("username:password").getBytes())); String base64encodedCredentials = "Basic " + encoded; myService.getRequestFactory().setPrivateHeader("Proxy-Authorization", base64encodedCredentials);
请注意,上述代码使用 Apache Commons Codec 软件包,以便执行必要的 base64 编码。您必须导入 org.apache.commons.codec.binary.Base64
类才能运行上述代码。
.NET
通过 .NET 客户端库使用 HTTP 代理与使用 Java 客户端轻而易举,但在特定产品创建服务对象时可采用类似的方式完成。
例如,我们可能想使用代理与 Google 日历服务进行交互:
using System.Net; CalendarService service = new CalendarService("CalendarSampleApp"); query.Uri = new Uri(calendarURI); GDataRequestFactory requestFactory = (GDataRequestFactory) service.RequestFactory; IWebProxy iProxy = WebRequest.DefaultWebProxy; WebProxy myProxy = new WebProxy(iProxy.GetProxy(query.Uri)); // potentially, setup credentials on the proxy here myProxy.Credentials = CredentialCache.DefaultCredentials; myProxy.UseDefaultCredentials = true; requestFactory.Proxy = myProxy;
这应该会从互联网连接设置中检测到必要的代理,这是 .NET 库的一项出色功能。但是,如果您不相信它能正确发现该代理,也可以通过将代码更改为以下代码来设置代理:
using System.Net; CalendarService service = new CalendarService("CalendarSampleApp"); GDataRequestFactory requestFactory = (GDataRequestFactory) service.RequestFactory; WebProxy myProxy = new WebProxy("http://my.proxy.example.com:3128/",true); // potentially, setup credentials on the proxy here myProxy.Credentials = CredentialCache.DefaultCredentials; myProxy.UseDefaultCredentials = true; requestFactory.Proxy = myProxy;
总结
本文讨论了如何将部分 Google Data API 客户端库与 HTTP 代理服务器配合使用。由网络政策强制使用的代理服务器支持的开发者仍然可以使用这些库。开发者还可以使用代理服务器帮助调试其代码,具体方法是:让代理服务器记录 HTTP 请求的内容以及向/从 Google 网络服务发送的响应。本教程中介绍了代理服务器和其他客户端库的更高级用例。建议需要其他帮助的开发者加入我们的公开支持群组(如下所示)。
如需详细了解本文中使用的客户端库,请访问以下页面:
其他资源:
- Google 数据 API 支持论坛
- Objective-C 简介 Wiki 页面 - 简要讨论如何从代理服务器捕获错误并使用用户对话框进行身份验证。