GCalViewer開発メモ

オープンアプリ(Java™)環境でのGoogle Calendar Data APIの使用方法など、GCalViewer作成時のメモです。

通信について

オープンアプリプレイヤーは1回のHTTP/HTTPSレスポンス最大サイズが32KB、1日の合計通信量が3MBという制限があります。また、通信開始時は毎回確認メッセージが表示されます。

これらの制限はありますが、オープンアプリプレイヤーでは(Trustedでない)DoJaにあるような「jarをダウンロードしたホスト、ポート以外とは通信できない」といった制限はありません。

また、HTTPリクエストヘッダを自由に設定可能です(User-Agent等、変更できないものもあります)。

ClientLogin

Googleアカウント認証にはClientLoginを使用します。以下はカレンダーサービス利用時のサンプルです。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
String url = "https://www.google.com/accounts/ClientLogin";

String data =
    "accountType=GOOGLE" +
    "&Email=" + encode(email) +
    "&Passwd=" + encode(password) +
    "&service=cl" +
    "&source=xxx";

byte[] bytes = data.getBytes();

HttpConnection conn = (HttpConnection)Connector.open(url);
conn.setRequestMethod(conn.POST);
conn.setRequestProperty(
    "Content-Type""application/x-www-form-urlencoded");
conn.setRequestProperty(
    "Content-Length", String.valueOf(bytes.length));

OutputStream os = conn.openOutputStream();
os.write(bytes);

int rc = conn.getResponseCode();
if (rc == 200){
    // レスポンスから Auth= の値を取得
}

レスポンスは以下のような形式になっています。実際に使用するのは Auth= の値で、SID,LSIDは使用しません。

SID=DQAAAGgA...7Zg8CTN
LSID=DQAAAGsA...lk8BBbG
Auth=DQAAAGgA...dk3fA5N

リクエスト

feed取得などのHTTPリクエスト時に、ClientLoginで取得した Auth=の値を以下のように使用します(authに値が入っているものとします)。

1
2
conn.setRequestProperty(
    "Authorization""GoogleLogin auth=" + auth);

PUT/DELETE

オープンアプリプレイヤーでは HTTP PUT, DELETEは使用できません。Googleでは PUT, DELETEを利用できない環境向けのワークアラウンドが提供されています。リクエストヘッダを以下のように設定します。

1
2
3
conn.setRequestMethod(conn.POST);
conn.setRequestProperty(
    "X-HTTP-Method-Override""DELETE");

上記では実際のリクエストはPOSTですが、DELETEとして扱われるようになります。同様に "PUT"を指定することでPUTも可能になります。

リダイレクト処理

多くのリクエストでは HTTP 302(Moved temporarily)が返されます。基本的に全てのリクエストで302が発生し得るものとして実装する必要があります。以下は単純な例です。

1
2
3
4
5
int rc = conn.getResponseCode();
if (rc == 302){
    String location = conn.getHeaderField("Location");
    // location 宛てにリクエストを再送
}

リダイレクト時には gsessionidが付加されたURLがLocationに設定されます。次回以降、リクエストパラメーターにこのgsessionidを指定することでリダイレクトが発生しないようになります。ただし、sessionidの期限切れなどで再度リダイレクトが発生する可能性は常に考慮する必要があると思われます。