はつねの日記

Kinect, Windows 10 UWP, Windows Azure, IoT, 電子工作

Windows Azure Mobile ServicesにカスタムAPIを追加する

VWindows Azure Mobile Servicesは、最近はやりのBaaS (Backend as a Service) になります。

 

BaaSは、認証や通知、データストアなどクライアントアプリを作るときに必要な共通的な裏側の仕組みが最初からクラウドとして提供されていてそこを設定すれば、サーバー側の構築が完了するというものです。

 

単純に毎回同じことをする部分が提供されているというだけではなく、もちろん、Windows Azure Mobile ServicesであればMicrosoft本社の技術者がちゃんと設計構築したものですから、提供されている機能について基本的な部分がミスっているなんて言うことが運用後に見つかるなんて言うことはありません。

 

でもそうすると「スマホアプリ開発はやってきたけど、サーバー側まで用意して構築したことなくて」なんていうときにも安心して始められます。なんて勘違いも起きますが、チョイスした機能やそもそもやろうとしていることがあっているかどうかなどの知識は必要ですし、経験の有無の影響で言えば、経験のある人が使った時こそ最良最短の構築ができるということを忘れてはいけないと思います。

 

それよりも重要なのは、BaaSがクラウドであるという点です。初期ン小さな利用規模のときは(最近の傾向としていろいろなクラウドにある)無料枠や低価格枠を使ってイニシャル運用コストを抑え、スマホアプリでありがちなスパイクピークや人気アプリになっての急激な利用者増に対して最短時間でインフラ対応できる点でしょう。従来の企業内アプリのようにある程度の利用予測が外れにくいのと違い、外的要因でいくらでも利用率が上下する一般公開のアプリであれば、このようなバックエンド対応は必須といえると思います。

 

BaaSで面白いのはモバイルファーストというか、プログラム側でデータストアに格納してほしいデータセットをクラスとして定義しておいてBaaSに格納すると必要な構造のデータベースが(実際は空構造のテーブルくらいは最初につくっておく必要があるものが多いようですが)つくられるという機能でしょう。

 

でも、この方法で作られるエンドポイントは、CRUD (Create,Read,Update,Delete)相当の4つのエンドポイントで、やりとりするJSON形式データの中身はデータストアの1レコード相当のデータ丸ごとになります。

 

条件指定して検索して一部の列の結果が欲しいとか、データベース側のストアードプロシジャを実行したいときはどうすればよいかといえば、Windows Azrue Mobile Servicesであれば「カスタムAPI」を作成して対応します。

image

 

エンドポイントに対するメソッドにはいくつかありますが、HTTP-GETに相当するGETにカスタム操作を実装するとテストしやすいので、まずはGETにテーブルのデータをすべて取得するカスタムAPIを記述してみましょう。

image

カスタムAPIの記述には、残念ながらVB.NETC#はまだ使えずnode.jsで記述することになります。

request.servce.tables.getTableで指定したテーブルを指定し、readメソッドでデータ取得が成功したらsuccess:を実行します。

成功した時に取得した結果を返却したいときは、response.sendに書けばいいって感じですね。

このあたりの文法は「モバイル サービスのサーバー スクリプト リファレンス」にのってますので、一度見てみるといいでしょう。

 

このカスタムAPIのGETメソッドの動作を確認するときは、アクセス権を一時的に「すべてのユーザ」にしてエンドポイントが「Search」ならば、「http:hogehoge.azure-mobile.net/api/Search」のようなURLでアクセスすれば確認できます。しかしそのままブラウザでやると「search.jsonを開くか、または保存しますか。」となってファイルとして確認しなければならないので、F12開発者ツールを使うと便利です。

image

 

検索結果は[詳細]タブの中の[応答本文]として返却されます。

まず、[応答ヘッダー]で応答が「200 OK」であることを確認します。

image

正常応答ならば[応答本文]を参照します。今回はMobile Servicesの設定で作った直後のテーブルなので中身は空になります。

image

 

それでは次にテーブル全体ではなくSELECT文で実行結果をもってきてみましょう。

image

このようなテーブルがあったとします。このテーブルはWindwos Azure Mobile Servicesで作成したデータでもいいですし、Windows Azure Mobile Servicesが使っているSQL Serverに対して直接作成したテーブルでも問題ありません。

Windows Azure Mobile ServicesのカスタムAPIで次のように定義してみましょう。

exports.get = function(request, response) {
   var sql ='SELECT * FROM TestTable';
   request.service.mssql.query(sql, {
      success: function(results) {
         response.send(statusCodes.OK, results);
      },
      error: function(err) {
         response.send(statusCodes.INTERNAL_SERVER_ERROR, err);
      }
   });

 

定義が終わったらさっそく実行してみると次のようにJSON形式でデータが取得できました。

image

 

これでWindwos Azure Mobile Servicesが使っているSQL Serverにテーブル定義を追加して、それに対していカスタムAPIでデータを取得することができました。

 

単にWindows Azure Mobile Servicesの機能でクラス定義から自動的にテーブル定義作ってそのデータ全部をCRUDするという単純な使い方だけではなく、ぜひ、Windows Azure Mobile ServicesとカスタムAPIで、今までのノウハウを活用してた実用的なBaaSとして利用してみてください。