読者です 読者をやめる 読者になる 読者になる

銀の光と碧い空

クラウドなインフラとC#なアプリ開発の狭間にいるエンジニアの日々

Azure MobileServices のクライアントライブラリを使って、カスタムAPIのGETとPOST をしてみる

以前、コマンドラインで直接カスタムAPIでアクセスする方法を紹介しました。

Azure Mobile Services でアクセス許可を制限した Custom API に カジュアルにアクセスする - 銀の光と碧い空

今回は、クライアントライブラリでアクセスする方法を紹介したいと思います。

まず、しこみとしてMobileServies側にGetとPostに対応したsampleapiというカスタムAPIを作っておきます。

sampletable というテーブルも作っておきます。デフォルトの動的スキーマ*1をONにしているため、カラムを定義はしていません。 ここからクライアントライブラリに移ります。

Azure MobileServiesはWindowsばかりでなくAndroidやiOSにも対応しているのが特徴の一つですが、Nugetで提供されているクライアントライブラリもXamarin.AndroidとXamarin.iOSに対応しています。そこで今回は、PCL(Portable Class Library)で作ってみました。PCLプロジェクトを作成し、対象を.NET 4.5.1, Windows Store, Xamarin.iOS, Xamarin.Android (XamarinのVS拡張をインストールしている場合)にします。

そして Nugetから「WindowsAzure.MobileServices」をインストールします。GET と POST に対応したコードはこうなります。

MobileServieClient のコンストラクタに渡す引数は、MobileServiesのダッシュボードで確認してください。

InvokeApiAsync メソッドを使うとカスタムAPIを呼び出せますが、オーバーロードがたくさん用意されています。クエリ文字列つきでGETを呼び出したいときは

InvokeApiAsync(string apiName, HttpMethod method, IDictionary<string, string> parameters)

を使います。Tで指定した型にサーバーからの返り値をパースしますが、IEnumerable にパースしています。(MyDataがテーブルに格納されている1レコードに相当)

POSTでBodyを渡して、かつ返り値をもらう場合は、

InvokeApiAsync<T, U>(string apiName, T body)

を使います(この他、上と同様HTTP Methodとクエリ文字列を指定できるオーバーロードもあり)。BodyにはMyData を指定して、返り値は JObject を指定してJSONに近い形で返しています。

さて、これを呼び出すコードですが、さくっとコンソールアプリで試してみます。新規にコンソールプロジェクトを追加し、作ったPCLプロジェクトへの参照を追加します。そして、 こちらのコードにもNugetから「WindowsAzure.MobileServices」を追加します。コンソールアプリ側で MobileServies のクラスを直接使わない場合でも、プラットフォームごとに必要な拡張*2を参照するために必要です。これを忘れると実行時エラーが発生します。

実際のコードはこんな感じです。

実行すると

f:id:tanaka733:20140211175832p:plain

と表示され、MobileServies側のテーブルは、

f:id:tanaka733:20140211175933p:plain

となって確かに追加されていることがわかります。

という感じでクライアントライブラリを使って簡単にAPIをたたけました。クライアントライブラリの利点はPCLで使えることで、Xamarinを通して複数のプラットフォームをC#のコードで記述できることです*3。 ただ、現時点ではNugetに既知の問題があって、今回のコードでも参照する Microsoft.Bcl を参照するとコンパイルできなくなります。

Known Issues using Portable Libraries with the Xamarin tools

対応予定ということなので期待したいと思います!

*1:リクエストに応じて自動的にRDBのカラムが作成されるモード

*2:Microsoft.WindowsAzure.Mobile.Ext というアセンブリ

*3:サーバーサイドがJavaScriptなんですが!!