OpenSocialを利用してガジェットを作ろう!

第4回 レスポンスの処理とrequestShareApp

この記事を読むのに必要な時間:およそ 3 分

前回は,はてブチェッカーのhomeビューでオーナーの「友達一覧」,「プロフィール情報」,「アプリデータに保存されたはてなID」,オーナーの友達の「アプリデータに保存したはてなID」という4つのリクエストを送信するところまで解説しました。

今回はそのレスポンスを受け取る部分と,友達にガジェットを紹介するための機能の利用方法について解説します。

DataResponseとResponseItem

opensocial.DataRequestで送信したリクエストのレスポンスは,opensocial.DataResponseオブジェクトのインスタンスを引数としてコールバック関数に返ってきます。

opensocial.DataResponseオブジェクトは,バッチで送信した複数のリクエストに対するレスポンスを1つにまとめて返すものです。複数のリクエストの結果,全て成功したのか,それともその中の1つでも失敗したリクエストがあったかを,hadErrorメソッドで確かめることができます。

リスト1 DataResponseのエラーチェック

function callback(response) {
  if (response.hadError()) {
    // ひとつでもエラーがある場合は中止する処理
  } else {
    // エラーがなければ継続する処理
  }
}

バッチで送信したリクエストに対する各レスポンスは,リクエスト追加時に付加したキーを使って個別に呼び出すことが出来ます。

リスト2 キーを使ったResponseItemの取得

var result = response.get('friends');

ここで得られるopensocial.ResponseItemオブジェクトのインスタンスは,リクエストに対する実際のレスポンス内容を含みます。このオブジェクトのhadErrorメソッドを使うことによって,リクエストごとにエラーが発生したかどうかをチェックすることが可能です。

リスト3 ResponseItemのエラーチェック

if (result.hadError()) {
  // エラーがあればメッセージを表示する処理
} else {
  // エラーがなければ継続する処理
}

「opensocial.DataResponseオブジェクトとopensocial.ResponseItemオブジェクトのどちらでエラーチェックを行えばいいの?両方やるの?」と思う方もいらっしゃるかもしれません。使い分けとしては,バッチで送信した複数のリクエストの中に1つでもエラーがあるとNGの場合はopensocial.DataResponse,そうではない場合はopensocial.ResponseItemでチェックするのが定石と覚えておきましょう。

opensocial.ResponseItemオブジェクトのエラーチェックで問題ないことが分かったら,getDataメソッドでリクエストに応じた各種レスポンス内容を受け取ることができます。

プロフィール情報のレスポンス

プロフィール情報のレスポンスで返ってくるのはopensocial.Personオブジェクトです。opensocial.PersonオブジェクトはgetDisplayNameメソッドでニックネームを,getIdメソッドでIDを取得することが出来ます。その他の属性情報については,getFieldメソッドに欲しい情報のフィールド名を渡すことで取得することが出来ます。

リスト4 プロフィール情報の取得

var person = result.getData();
// ニックネームを取得
var name = person.getDisplayName();
// gooIDを取得
var id = person.getId();
// プロフィールアイコンのURLを取得
var icon = person.getField(opensocial.Person.Field.THUMBNAIL_URL);
// 予めPROFILE_DETAILSで指定をしていたため,関連URLを取得することができる
var urls = person.getField(opensocial.Person.Field.URLS);

ここではてブチェッカーに実装した,OpenSocialとgooホームだからこそ可能なテクニックをひとつご紹介しましょう。

gooホームには,FriendFeedのように外部利用サービスからフィードをインポートする機能があります。リクエストを行う際にPROFILE_DETAILSにURLSも指定を行っておくことにより,予めユーザが設定を行っている外部利用サービスのURLを取得することができます。もちろん,gooホームははてなブックマークにも対応しているため,はてなブックマークのURLも取得することが可能です。

そこで,はてブチェッカーでは,homeビューの「設定」タブからはてなIDを設定しなくても,もし外部利用サービスとしてはてなブックマークのURLが登録されていた場合には,そのURLから抽出したはてなIDを自動的に設定するようにしています。

下記はプロフィール情報からURLを取得して,はてなIDをアプリデータに保存する実際のコードです。

リスト5 はてなIDの抽出

var owner = result.getData();
// オーナーのプロフィールからはてなIDを抽出する処理
if (owner.getField(opensocial.Person.Field.URLS)) {
  var urls = owner.getField(opensocial.Person.Field.URLS);
  // 取得したURLSをループ
  for (var key in urls) {
    var url = urls[key].getField(opensocial.Url.Field.ADDRESS);
    // プロフィール情報にはてブURLが含まれ,アプリデータにまだIDが保存されていない場合
    // プロフィール情報のはてブURLからはてなIDを補完して保存する
    if (url.match(/^http:\/\/b\.hatena\.ne\.jp/) && hatena_id == '') {
      hatena_id = url.replace(/^http:\/\/b\.hatena\.ne\.jp\/(.*?)\/.*$/, '$1');
      // その場でアプリデータに保存
      var req = opensocial.newDataRequest();
      req.add(req.newUpdatePersonAppDataRequest('VIEWER', 'id', hatena_id));
      req.send();
    }
  }
}

著者プロフィール

北村英志(きたむらえいじ)

NTTレゾナントでgooのソーシャル化にコンセプトから携わる。OpenSocial対応に当たっては, OpenSocialCommunityへの仕様提案だけでなく,Shindigへのコード提供も行っている。Google API Expert(OpenSocial)。SocialWeb Japan主催。

URLhttp://devlog.agektmr.com/

コメント

コメントの記入