モバイルサービスのデータストア
ここからはサーバー側のデータストアについて解説します。
データのアクセス権限
先述したとおり、モバイルサービスのデータにはアクセス権限があります。これらは、管理ポータルから確認、設定することができます。
管理ポータルのデータ画面から、[アクセス許可]を選択します(図10)。挿入、更新、削除、読み込みについて、それぞれアクセス権限を設定できます。
各アクセス権限についての意味は、下表のとおりです。
アクセス権 | 意味 |
---|---|
すべてのユーザー | アプリケーションキーが不要で、誰でもアクセス可能です。 |
アプリケーションキーを持つユーザー | アプリケーションキーを持っていればアクセス可能です。 |
認証されたユーザーのみ |
認証されたユーザーのみアクセス可能です。 認証のためには、マイクロソフトアカウントや Facebook、Twitter、Googleなどと連携できます。 |
スクリプトと管理者のみ |
サーバーサイドのスクリプトと、管理者 (マスターキー保有者)のみアクセス可能です。 |
モバイルサービスへの接続でも触れましたが、本稿で説明したサンプルではアプリケーションキーを利用しています。これ以外にもアクセス権限を設定することによって、アプリケーションキーが不要だったり、アプリケーションキー以外のマスターキーが必要だったりします。
これらは、管理ポータルのモバイルサービス画面下部の[キーの管理]を選択すると確認できます(図11)。また[再生成]ボタンをクリックすることによって、キーの値を再生成することも可能です。
サーバースクリプト
モバイルサービスでは、サーバーサイドで実行するカスタムビジネスロジックをJavaScriptで実装できます。クライアントサイドではなく、サーバーサイドで何らかの処理したい場合に便利な機能です。これらは、データの挿入、更新、削除、読み取りごとに実行されます。スクリプトは管理ポータル上のエディタから編集することができます。管理ポータルのデータ画面から[スクリプト]を選択します。[操作]は既定で[挿入]が選択されているでしょう(図12)。
上記の例では、挿入処理時に呼ばれる関数を定義しています。いずれの動作においても、requestオブジェクトのexecuteメソッドを呼ぶことによって、要求した処理が完了します。挿入(Insert)以外にも、更新(Update)、削除(Delete)、閲覧(Read)が選択でき、それぞれの操作時のスクリプトを定義できます。
1. サーバースクリプトの編集
サンプルアプリケーションでは空白の文字を登録できてしまうため、これを抑止する処理をスクリプトに追加してみましょう。リスト6の内容を入力して、画面下部の[SAVE]ボタンをクリックします。
function insert(item, user, request) { if (item.text.trim().length === 0) { (1) console.log('Text is null.'); (2) request.respond(statusCodes.BAD_REQUEST, 'Text is null.'); (3) } else { request.execute(); } }
スクリプトの内容について解説すると、第1引数のitemオブジェクトには、データに対応したtextプロパティに文字列が格納されて渡されます。第2引数のuserオブジェクトは、認証サービスを利用したときの認証情報が格納されますが、それ以外は未定義です。第3引数のrequestオブジェクトは、要求されたリクエストに応答するための操作メソッドが提供されます。
(1)のif文では、textプロパティの文字列をトリムして長さが0ならばエラーの処理を実施しています。
(2)はconsoleオブジェクトのlogメソッドを呼び出し、ログ出力をしています。出力されたログは管理ポータルから確認することができます(図13)。
(3)は、requestオブジェクトのrespondメソッドを呼び出して、クライアント側にエラーを通知(HTTP Error 400 Bad Request)しています。
サーバー側のスクリプトについては、「MSDNのサーバースクリプトリファレンス」を参照してください。
2. クライアント側の修正
サーバーサイドでエラーを返却するように修正しましたが、そのままでは例外が発生してしまうため、クライアント側で正しく例外をキャッチする必要があります(リスト7)。
using Windows.UI.Popups; ...(3) ... private async void InsertTodoItem(TodoItem todoItem) { try { await todoTable.InsertAsync(todoItem); items.Add(todoItem); } catch (MobileServiceInvalidOperationException e) ...(1) { var dialog = new MessageDialog(e.Response.Content, ...(2) string.Format("{0} {1}", e.Response.StatusDescription, e.Response.StatusCode)); var ignoreResult = dialog.ShowAsync(); ...(4) } }
サーバー側でエラーが返却されると、MobileServiceInvalidOperationExceptionが発生するため、(1)のcatch文で例外をキャッチします。(2)では例外オブジェクトから必要な情報を取得しダイアログを作成しますが、(3)のusingが必要です。(4)のダイアログを表示では、Responseオブジェクトのコンテンツ、ステータス情報を表示しています。これらの内容は、リスト6のrespondメソッドで応答した情報に対応します。
ここでも表示は非同期メソッドのみ用意されており、ダイアログを表示する場合も従来のShowメソッドではなく、ShowAsyncメソッドを呼び出します。
まとめ
Windows Azure モバイルサービスを利用することによって、簡単にモバイルサービスの基盤が構築できることが理解いただけたでしょうか。現在、マイクロソフトはWindows Azureを基盤としたサービスレイヤーの強化に注力しているようにみえます。今後もWindows Azureで提供されるサービスが増えてくるかと思います。
次回以降は、もう少し踏み込んで、サーバーサイドのスクリプトや、モバイルサービスの認証、プッシュ通知について解説していきたいと思います。