善用代理伺服器:搭配 Google Data API 用戶端程式庫使用 Proxy 伺服器

Google Data API 團隊 Jeff Fisher
2007 年 6 月

簡介:為何要使用 Proxy?

Proxy 伺服器是電腦 (或電腦上的服務),通常會代表多部用戶端電腦向外部資源發出要求。本文主要探討 HTTP Proxy 伺服器,因為 HTTP 是存取 Google 網路服務公開 API 時使用的通訊協定。因此,當您發出含有私密使用者資料或密碼等私密資訊的 HTTP 要求時,也應使用 HTTPS 或 SSL 代理伺服器。現今許多大型公司會使用 HTTP 代理伺服器,控管員工在網路上可瀏覽的網站或資訊。公共圖書館和學校也曾為此目的導入 Proxy。此外,您也可以使用許多公開的 Proxy 伺服器,匿名存取網路內容。

使用 Proxy 伺服器時可能發生的問題,取決於使用的軟體和設定方式。如果 Proxy 除了 Proxy 識別和驗證所需的變更外,不會以任何方式變更用戶端的要求或伺服器的回應,則視為「透明」。不過,大量 Proxy 伺服器會以開發人員應注意的方式,變更要求或回應。具體來說,某些 Proxy 會變更回應的內容類型,或從傳送至代管資源的外部伺服器中,移除 HTTP 持續連線標頭。

那麼,開發人員為何要使用 HTTP 或 SSL Proxy?一般而言,這有兩個原因:某些公司基礎架構需要這麼做,或是開發人員想偵錯使用網路服務的應用程式。如果開發人員使用的網路規則禁止連線至外部網站 (非透過 Proxy 或 SSL 連線),則第一個原因完全無法避免。在支援論壇中,開發人員經常回報後者,因為他們在處理 Google 網路服務時,會嘗試排解問題。有些「偵錯」專用 Proxy (例如 FiddlerCharles) 就是為這種情況而設計。如要進一步瞭解如何使用 Proxy 伺服器,請參閱「On the Wire: Tools for API Developers」一文。

部分應用程式可能難以新增 Proxy 伺服器支援。 所幸,只要稍微修改程式碼,大部分的 Google Data API 用戶端程式庫都能搭配 HTTP Proxy 伺服器運作。本文旨在為開發人員提供入門資訊,協助他們為應用程式發出的網路要求使用 Proxy 伺服器。

Java

由於 Sun 使用系統屬性管理連線設定,因此透過 Java 用戶端程式庫使用 HTTP Proxy 相當簡單。

舉例來說,如果您的公司 Proxy 伺服器是在「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 代理伺服器。如果上一個範例中的相同 Proxy 伺服器在通訊埠 3129 上執行 SSL Proxy,則必要的程式碼如下:

System.setProperty("https.proxyHost", "my.proxy.domain.com");
System.setProperty("https.proxyPort", "3129");

您也可以透過指令列執行此操作,方法與 HTTP Proxy 相同。

有時您可能需要提供 Proxy 伺服器的憑證,才能使用該伺服器。通常會使用 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 Proxy 的使用方式不像 Java 用戶端那麼簡單,但建立特定產品的服務物件時,可以採用類似方式。

舉例來說,我們可能想使用 Proxy 與 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;

這項功能會從網際網路連線設定偵測必要的 Proxy,這是 .NET 程式庫的實用功能。不過,如果您不信任該服務能正確探索 Proxy,也可以將程式碼變更為下列內容來設定 Proxy:

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 Proxy 伺服器運作。如果開發人員必須透過網路政策規定的 Proxy 伺服器工作,仍可使用這些程式庫。開發人員也可以使用 Proxy 伺服器,記錄傳送至 Google 網路服務和從該服務傳送的 HTTP 要求和回應內容,藉此偵錯程式碼。本教學課程未涵蓋 Proxy 伺服器和其他用戶端程式庫的進階用途。如需進一步協助,開發人員可以加入下列公開支援群組。

如要進一步瞭解本文使用的用戶端程式庫,請參閱下列頁面:

其他資源: