2007 年 6 月
はじめに: プロキシを選ぶ理由
プロキシ サーバーは、ユーザーに代わって多数のクライアント コンピュータにリクエストを行うコンピュータ(またはコンピュータ上のサービス)です。通常は外部リソースに対してリクエストされます。ここでは、HTTP プロキシ サーバーについて説明します。HTTP は、Google のウェブサービス用の公開 API へのアクセスに使用されるプロトコルです。ひいては、ユーザーの個人情報やパスワードなどの機密情報を含む HTTP リクエストを行うときに HTTPS や SSL プロキシも重要になります。今日、多くの大企業が HTTP プロキシを使用して、インターネットで閲覧できるウェブサイトや情報を管理しています。この目的のためにプロキシを導入することが公共図書館や学校で知られています。ウェブ コンテンツに匿名でアクセスするために使用できるプロキシ サーバーも多数用意されています。
プロキシ サーバーの使用時に発生する可能性のある問題は、使用されているソフトウェアとその構成方法によって異なります。プロキシがクライアントからの要求またはサーバーからの応答を、プロキシの識別と認証に必要ではない方法で変更しない限り、「プロキシ」は「透過的」と見なされます。ただし、多くのプロキシ サーバーは、デベロッパーが認識する必要がある方法でリクエストまたはレスポンスを変更します。特に、プロキシによってレスポンスのコンテンツ タイプが変更されるか、HTTP キープアライブ ヘッダーがリソースをホストする外部サーバーに送信されることがなくなります。
では、開発者が HTTP または SSL プロキシを使用するのはなぜでしょうか。一般に、これには企業のインフラストラクチャに必要な場合と、デベロッパーがウェブサービスを使用するアプリケーションをデバッグする場合の 2 つの理由があります。1 つ目の理由は、デベロッパーが作業しているネットワークのルールで外部ウェブサイトへのプロキシを経由しないウェブ接続や SSL 接続を禁止する場合、完全に回避できません。後者は、Google ウェブサービスを運用する際に問題のトラブルシューティングを試みるデベロッパーのサポート フォーラムで頻繁に報告されます。このような状況のための、Fiddler や Charles など、目的に特化した「デバッグ」プロキシがあります。プロキシ サーバーの使用について詳しくは、Wire: API デベロッパー ツールをご覧ください。
一部のアプリケーションでは、プロキシ サーバーのサポートを追加するのが難しい場合があります。幸いなことに、Google Data API のほとんどのクライアント ライブラリは、コードを少し変更するだけで、HTTP プロキシ サーバーで動作できます。この記事は、アプリケーションによって行われたウェブ リクエストにプロキシ サーバーを使用する出発点として意図されたものです。
Java
Java のクライアント ライブラリでは HTTP プロキシを簡単に使用できます。Sun ではシステム プロパティを使用して接続設定を管理しているため、
たとえば、会社のプロキシ サーバーがポート 3128 の「my.proxy.domain.com」で実行されていた場合は、Google カレンダーや Google スプレッドシートなどのサービス オブジェクトを作成する前に、次のコードをコードに追加します。
System.setProperty("http.proxyHost", "my.proxy.domain.com"); System.setProperty("http.proxyPort", "3128");
または、サーブレット環境を起動するときにコマンドラインでこの操作を行います。
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);
上記のコードでは、必要な base64 エンコードを行うために Apache Commons Codec パッケージを使用しています。上記のコードを実行するには、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 ウェブサービスとの間で送受信される HTTP リクエストとレスポンスの内容を記録します。プロキシ サーバーとその他のクライアント ライブラリのより高度なユースケースについては、このチュートリアルでは扱いません。サポートが必要なデベロッパーには、以下のリンクにある公開サポート グループに参加することをおすすめします。
この記事で使用するクライアント ライブラリの詳細については、次のページをご覧ください。
その他のリソース
- Google Data API のサポート グループ
- Objective-C 導入 Wiki ページ - プロキシ サーバーからのエラーのキャッチとユーザー ダイアログでの認証について簡単に説明します。