生活要點:搭配 Google Data API 用戶端程式庫使用 Proxy 伺服器

Google Data API 團隊的 Jeff Fisher
2007 年 6 月

簡介: 使用 Proxy 的好處

Proxy 伺服器是電腦 (或電腦上的服務),可代表多個用戶端電腦 (通常是外部資源) 發出要求。本文與 HTTP Proxy 伺服器相關,因為 HTTP 是用於存取 Google 網路服務公開 API 的通訊協定。以 HTTP 或 SSL Proxy 為例,如果您發出的 HTTP 要求中含有敏感的使用者資料或密碼等私人訊息內容,則也會感興趣。現今許多大型公司都會使用 HTTP Proxy 來控管員工能在網際網路上檢視的網站或資訊。而公立圖書館及學校也廣為實現這個目的而使用 Proxy。此外,還有數種公開的 Proxy 伺服器可用來匿名存取網頁內容。

使用 Proxy 伺服器時會遇到的潛在問題,取決於所使用的軟體和設定方式。如果 Proxy 不會改變用戶端的要求或伺服器的回應,除了 Proxy 識別與驗證之外的要求,就屬於「透明」性質。然而,大量的 Proxy 伺服器會對開發人員應有註意的方式變更要求或回應。具體來說,部分 Proxy 會改變回應的內容類型,或者將 HTTP 保持運作標頭從傳送至資源的外部伺服器中移除。

為什麼開發人員想要使用 HTTP 或 SSL Proxy?一般來說,有以下兩種原因:部分公司基礎架構要求使用,或開發人員希望針對使用網路服務的應用程式進行偵錯。假如開發人員正在處理的網路規則會禁止透過非 Proxy 的網路或 SSL 連線至外部網站,第一個原因完全無法避免。我們的支援論壇常會回報後者,因為開發人員在處理 Google 網路服務時,也無法順利排解問題。還有一種特殊用途的「偵錯」Proxy,例如 FiddlerCharles 來因應此種情況。如要進一步瞭解使用 Proxy 伺服器的情形,請參閱線上連線:API 開發人員專用工具一文。

對某些應用程式而言,新增 Proxy 伺服器支援並不容易。 幸好,在稍微修改程式碼之後,Google Data API 的大部分用戶端程式庫都可以與 HTTP Proxy 伺服器搭配運作。本文旨在協助開發人員使用 Proxy 伺服器處理應用程式發出的網路要求。

Java

在 Sun 使用系統屬性管理連線設定的情況下,透過 HTTP 用戶端程式庫使用 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。如果上一個範例中的 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 伺服器,讓 Proxy 伺服器記錄從 Google 網路服務收發的 HTTP 要求內容和回應,協助對程式碼進行偵錯。本教學課程並未介紹 Proxy 伺服器和其他用戶端程式庫的進階用途。我們建議需要其他協助的開發人員加入以下的公開支援群組。

如要進一步瞭解本文中使用的用戶端程式庫,請造訪下列網頁:

其他資源: