Azure モバイル サービス

Azure のモバイル サービスは秀逸です。
Push 通知ですと Amazon SNS に目が行きがちですが、とても使いやすいサービスになっています。

  • Azure は MS のクラウドなので、当然のこととして SQL Server を持っており、極容易に連携が可能。
    • デバイストークンの管理用のテーブルや、ユーザ毎のデータ用のデータベースを独自に用意する必要がない
    • しかもスキーマレスであり、開発中などで後からカラムを追加することも容易(もちろんスキーマレスでなくすことも可能)
    • データを挿入、削除等のタイミングをフックでき、そのタイミングでの処理をブラウザから実装できる(このユーザにこのデータが挿入されたら通知する、等)
  • バックエンドの API(通知を行う、DB にデータを登録する、外部 URL へ通信を行う)といった API を、ブラウザ上から実装、設定可能(AWS Lambda と似てますね)
    • バックエンドはデフォルトは Node.js ですが、C# でも実装可能です。

Node.js なので、require から様々な機能が使えます。
Push はもちろんのこと、他システムへの WebHook フック(例えば post)も可能です。

require('request').post({
    uri: 'http://www.example.com/receiver',
    form: {
        data_a: 'data_a',
        data_b: 100,
        data_c: true
    }
}, function(err, response, body) {
    if (err) {
        console.log(err);
    }
});

DB アクセスは、基本は

request.service.tables.getTable('テーブル名').read({
    success: function(results) {
    }
});

などと専用の API で読み書きを行いますが

request.service.mssql.query('TRUNCATE TABLE テーブル名', {
    success: function(results) {
    },
    error: function(err) {
    }
});

などとして自由に SQL を流すことも可能です。

チュートリアルがまた分かりやすく、これを読むだけで iPhone, Android への通知機能を1〜2時間程度でゼロから作ることができます。
Add push notifications to your Mobile Services app(iOS)
Add push notifications to your Mobile Services app(Android)
他社のサービスの設定方法まで詳しく丁寧に書かれているのが、素敵ですね。


というわけで、クライアントから Azure モバイル サービスに定義したバックエンド APIJava から HttpClient を用いて呼び出すプログラムを作成しました。
といっても簡単で、モバイルサービス名と API 名から決まる URL に対して、X-ZUMO-APPLICATION ヘッダーに API キーを設定しリクエストを投げるだけです。
FIXME になっている箇所はご自身の環境に合わせて修正しご利用くださいませ。

AzureUtils

public class AzureUtils {
    private static final String AZURE_API_KEY = "FIXME";

    private static final String AZURE_BASE_URL = "https://FIXME.azure-mobile.net";

    private static HttpResponse post(final String url, final UrlEncodedFormEntity parameters) throws IOException {
        final HttpClient client = new DefaultHttpClient();

        try {
            final HttpPost method = new HttpPost(url);

            method.setHeader("X-ZUMO-APPLICATION", AZURE_API_KEY);
            method.setEntity(parameters);

            return client.execute(method);
        } finally {
            client.getConnectionManager().shutdown();
        }
    }

    public static HttpResponse exec(final String apiName, final UrlEncodedFormEntity parameters) throws IOException {
        return post(AZURE_BASE_URL + "/api/" + apiName, parameters);
    }
}

UrlEncodedFormEntity に設定したパラメーター(例えば hoge)が、Azure の API で request.body.hoge として取れる寸法です。