代理実行: Google Data API クライアント ライブラリとプロキシ サーバーの併用

Jeff Fisher、Google Data APIs チーム
2007 年 6 月

はじめに: プロキシを使用する理由

プロキシ サーバーは、通常は外部リソースに対して、複数のクライアント コンピュータの代わりにリクエストを行うコンピュータ(またはコンピュータ上のサービス)です。この記事では、HTTP プロキシ サーバーについて説明します。HTTP は、Google のウェブ サービスの公開 API にアクセスするために使用されるプロトコルです。同様に、ユーザーの個人データやパスワードなどの機密情報を含む HTTP リクエストを行う場合にも、HTTPS プロキシまたは SSL プロキシが重要になります。現在、多くの大企業が HTTP プロキシを使用して、従業員がインターネットで閲覧できるウェブサイトや情報を制御しています。公共図書館や学校でも、この目的でプロキシが実装されていることが知られています。ウェブ コンテンツに匿名でアクセスするために使用できる公開プロキシ サーバーも多数存在します。

プロキシ サーバーの使用時に発生する可能性のある問題は、使用されているソフトウェアとその構成方法によって異なります。プロキシの識別と認証に必要な場合を除き、クライアントからのリクエストやサーバーからのレスポンスを一切変更しないプロキシは「透過的」と見なされます。ただし、多くのプロキシ サーバーは、デベロッパーが認識しておくべき方法でリクエストまたはレスポンスを変更します。特に、一部のプロキシはレスポンスのコンテンツ タイプを変更したり、リソースをホストする外部サーバーに送信される HTTP キープアライブ ヘッダーを削除したりします。

では、デベロッパーが HTTP プロキシまたは SSL プロキシを使用する理由は何でしょうか?一般的に、これには 2 つの理由があります。1 つは、企業インフラストラクチャで必要とされているため、もう 1 つは、ウェブ サービスを使用するアプリケーションをデバッグする必要があるためです。1 つ目の理由は、デベロッパーが作業しているネットワークのルールで、外部ウェブサイトへの非プロキシ ウェブ接続または SSL 接続が禁止されている場合、完全に回避できません。後者の理由は、Google ウェブサービスを扱う際に問題のトラブルシューティングを試みているデベロッパーから、サポート フォーラムで頻繁に報告されています。このような状況に特化した、FiddlerCharles などの特別な「デバッグ」プロキシがあります。プロキシ サーバーのこの使用方法について詳しくは、記事 On the Wire: Tools for API Developers をご覧ください。

一部のアプリケーションでは、プロキシ サーバーのサポートを追加することが難しい場合があります。幸いなことに、Google Data API のほとんどのクライアント ライブラリは、コードを少し変更するだけで HTTP プロキシ サーバーで動作させることができます。この記事は、アプリケーションから送信されるウェブ リクエストにプロキシ サーバーを使用したいデベロッパー向けの入門記事です。

Java

Sun がシステム プロパティを使用して接続設定を管理しているため、Java クライアント ライブラリで HTTP プロキシを簡単に使用できます。

たとえば、会社のプロキシ サーバーが「my.proxy.domain.com」のポート 3128 で実行されている場合は、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 リクエストとレスポンスの内容を記録し、コードのデバッグに役立てることもできます。このチュートリアルでは説明しない、プロキシ サーバーや他のクライアント ライブラリの高度なユースケースもあります。サポートが必要なデベロッパーは、以下のリンクから公開サポート グループにご参加ください。

この記事で使用されているクライアント ライブラリの詳細については、次のページをご覧ください。

その他のリソース