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,例如 Fiddler 和 Charles 來因應此種情況。如要進一步瞭解使用 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 伺服器和其他用戶端程式庫的進階用途。我們建議需要其他協助的開發人員加入以下的公開支援群組。
如要進一步瞭解本文中使用的用戶端程式庫,請造訪下列網頁:
其他資源:
- Google Data API 支援群組
- Objective-C 簡介維基頁面 - 簡要討論從 Proxy 伺服器擷取錯誤,以及如何驗證使用者對話方塊。