2007 年 6 月
简介:为何需要代理?
代理服务器是一台计算机(或计算机上的服务),它代表多台客户端计算机向外部资源发出请求。本文主要介绍 HTTP 代理服务器,因为 HTTP 是用于访问 Google 网络服务的公共 API 的协议。从广义上讲,当发出包含敏感信息(例如私密用户数据或密码)的 HTTP 请求时,HTTPS 或 SSL 代理也很有用。如今,许多大型公司都使用 HTTP 代理来控制员工可以在互联网上查看哪些网站或信息。众所周知,公共图书馆和学校也会出于此目的实现代理。此外,还有许多可公开使用的代理服务器,可用于匿名访问网络内容。
使用代理服务器时可能遇到的问题取决于所使用的软件及其配置方式。如果代理除了进行代理身份识别和身份验证之外,不会以任何方式更改来自客户端的请求或来自服务器的响应,则该代理被视为“透明”。不过,大量代理服务器确实会以开发者应注意的方式更改请求或响应。特别是,某些代理会更改响应的内容类型,或剥离要发送到托管资源的外部服务器的 HTTP Keep-Alive 标头。
那么,开发者为什么要使用 HTTP 或 SSL 代理?一般来说,出现这种情况有两个原因:某些公司基础架构需要这样做,或者开发者希望调试使用 Web 服务的应用。如果开发者所用网络的规则禁止非代理的 Web 或 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 代理服务器搭配使用。即使开发者在网络政策强制要求的代理服务器后面工作,仍然可以使用这些库。开发者还可以使用代理服务器来帮助调试代码,方法是让代理服务器记录发送到 Google Web 服务以及从 Google Web 服务发送的 HTTP 请求和响应的内容。代理服务器和其他客户端库还有一些更高级的用例,本教程未涵盖。我们鼓励需要更多帮助的开发者加入以下链接中提供的公开支持群组。
如需详细了解本文中使用的客户端库,请访问以下网页:
其他资源:
- Google Data API 支持论坛
- Objective-C 简介维基页面 - 简要讨论了如何捕获来自代理服务器的错误以及如何通过用户对话框进行身份验证。