Google Calendar API - Java Clientライブラリを使ってイベントを追加する

Google Calendar APIプロトコルを確認するために、Java Clientライブラリでイベントを追加するサンプルを動かした際のメモです。

サンプルを動かす

Google Calendar APIのドキュメントはこちら:

http://code.google.com/intl/ja/apis/calendar/data/2.0/developers_guide_java.html

ライブラリは、以下のサイトよりgdata-src.java-1.x.x.java.zip(2010/12/7現在gdata-src.java-1.42.0.zip)をダウンロードします。

http://code.google.com/p/gdata-java-client/downloads/list

ダウンロードしたzipファイルを解凍して以下のjarファイルをクラスパスに追加します。

  • gdata/java/lib/gdata-calendar-1.0.jar
  • gdata/java/lib/gdataclient-1.0.jar
  • gdata/java/lib/gdata-core-1.0.jar
  • gdata/java/deps/google-collect-1.0-rc1.jar

※gdata-core-1.0.jarはドキュメントには記述されていないので注意

カレンダーにPOSTするコードはサンプルの通り書けば動作を確認できます。

CalendarService myService = new CalendarService("exampleCo-exampleApp-1");
myService.setUserCredentials("hrendoh@gmail.com", "xxxxx");
			
URL postUrl =
	new URL("https://www.google.com/calendar/feeds/hrendoh@gmail.com/private/full");

CalendarEventEntry myEntry = new CalendarEventEntry();
myEntry.setTitle(new PlainTextConstruct("Tennis with Beth"));
myEntry.setContent(new PlainTextConstruct("Meet for a quick lesson."));
DateTime startTime = DateTime.parseDateTime("2010-12-07T15:00:00-08:00");
DateTime endTime = DateTime.parseDateTime("2010-12-07T17:00:00-08:00");
When eventTimes = new When();
eventTimes.setStartTime(startTime);
eventTimes.setEndTime(endTime);
myEntry.addTime(eventTimes);

// Send the request and receive the response:
CalendarEventEntry insertedEntry = myService.insert(postUrl, myEntry);

プロトコルについてメモ

クライアントライブラリを使ってる分には特に意識する必要が無いのですが、Google Calendar APIは、データ取得、データの更新ともに一度リダイレクトをはさみます。
例えば、

https://www.google.com/calendar/feeds/hrendoh@gmail.com/private/full

に一度アクセスすると、以下の様にgsessionidが追加されたURLにリダイレクトされます。

https://www.google.com/calendar/feeds/hrendoh@gmail.com/private/full?gsessionid=xxxxxxx

イベント追加の場合は再度そのURLにリクエストボディをPOSTしてあげる必要があります。
また、もうひとつ注意事項として、1度目のレスポンスには「S=calendar=xxxxx」(xxxxxはgsessionidと同じ)という値のSet-Cookieヘッダが含まれ、2度目のリクエストでは、このCookieヘッダを追加する必要があります。
上記の仕様は、ちゃんとドキュメントに書いてありますがちょっと面倒くさいです。

http://code.google.com/intl/ja/apis/calendar/data/2.0/developers_guide_protocol.html#CreatingEvents

2-Legged OAuthで認証

ついでに、2-Legged-OAuthでのアクセスも試したのでサンプルを張っておきます。

CalendarService myService = new CalendarService("exampleCo-exampleApp-1");

GoogleOAuthParameters params = new GoogleOAuthParameters();
params.setOAuthConsumerKey("xxxxxxxxx.apps.googleusercontent.com");
params.setOAuthConsumerSecret("xxxxxxxxxxxxxxxxxxxxxx"); 
OAuthSigner signer = new OAuthHmacSha1Signer();
myService.setOAuthCredentials(params, signer);
        
URL postUrl =
	new URL("https://www.google.com/calendar/feeds/hrendoh@infoscoop.org/private/full?xoauth_requestor_id=hrendoh@infoscoop.org");
CalendarEventEntry myEntry = new CalendarEventEntry();

myEntry.setTitle(new PlainTextConstruct("Tennis with Beth2"));
myEntry.setContent(new PlainTextConstruct("Meet for a quick lesson."));

DateTime startTime = DateTime.parseDateTime("2010-12-07T15:00:00-08:00");
DateTime endTime = DateTime.parseDateTime("2010-12-07T17:00:00-08:00");
When eventTimes = new When();
eventTimes.setStartTime(startTime);
eventTimes.setEndTime(endTime);
myEntry.addTime(eventTimes);

// Send the request and receive the response:
CalendarEventEntry insertedEntry = myService.insert(postUrl, myEntry);