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