Azure API ManagementとAzure モバイルサービスを組み合わせて使ってみた


![kobito.1402416220.009483.png](https://qiita-image-store.s3.amazonaws.com/0/31790/e526d58d-5a1e-8e7c-627c-db0b0d2ee68b.png "kobito.1402416220.009483.png")

Azure Remote Appがやっと使えるようになったけど、構成中のまま進まないので、あまり使われて無さそうなAPI Managementを試してみた。

API Managementは自分が作ったWeb APIを管理するために使う。Twitter APIとかでよくある１分間に５回まで、１日１００回までとかいったクォータを管理することができるのと、APIのドキュメントを自動生成してくれる。

考えられるシチュエーションとしては、とあるWebサービスなりスマホアプリを作成したら、マッシュアップのため開発者向けAPIを提供することになった。でも開発者用のAPIキーを管理するのはめんどくさいし、特定の開発者がリソースを占有するのも問題だ。削除のAPIを開発者に公開したくない。

そんなときに使えるサービスなのかなと思う。


## ダッシュボードはこんな感じでまぁまぁ見やすい感じ。

![kobito.1402416521.782845.png](https://qiita-image-store.s3.amazonaws.com/0/31790/12f05433-3281-3b8f-375b-b45adab54a76.png "kobito.1402416521.782845.png")

## モバイルサービスのAPIの追加
モバイルサービスのToDoItemテーブルを操作してみたいと思います。モバイルサービスは別途サービスを作成して、ToDoItemテーブルを作成しておきます。

API Managementにて、ADD API を選びます。

![kobito.1402417097.819989.png](https://qiita-image-store.s3.amazonaws.com/0/31790/5c11f382-2e41-e5c2-6d1e-0712058adaee.png "kobito.1402417097.819989.png")

タイトル、モバイルサービスのURL、API Managementのサフィックスをそれぞれ次のようにいれます。

![kobito.1402417234.289642.png](https://qiita-image-store.s3.amazonaws.com/0/31790/6ee48b8e-6e3b-e9fb-ef43-1ebf865f2e02.png "kobito.1402417234.289642.png")

一覧に表示されるので、TODOITEMSをクリックして編集します。

![kobito.1402417262.804404.png](https://qiita-image-store.s3.amazonaws.com/0/31790/3825252f-1615-a38f-4eb4-8cef6c198a9e.png "kobito.1402417262.804404.png")

「Operation」タブを選択し、「ADD OPERATION」をクリック。API Managementからモバイルサービスに対して行う操作を登録します。

![kobito.1402417327.451279.png](https://qiita-image-store.s3.amazonaws.com/0/31790/6777e897-0ba6-89d3-074d-1858c1ef7d3c.png "kobito.1402417327.451279.png")

次のようにHTTP verb等に値をいれます。

![kobito.1402417417.421747.png](https://qiita-image-store.s3.amazonaws.com/0/31790/3195d1e6-1c42-2278-f994-f8b460561f76.png "kobito.1402417417.421747.png")

Parametersは無くてもいいですが、とりあえずfilterだけ設定できるようにしてみます。パラメーターに設定できる値は他にもあります。[Query records operation](http://msdn.microsoft.com/en-US/library/azure/jj677199.aspx)を参照してください。

![kobito.1402417666.691807.png](https://qiita-image-store.s3.amazonaws.com/0/31790/8ba1c594-aea2-1022-1ffe-38785079594a.png "kobito.1402417666.691807.png")

設定が終わったらSaveをクリックして保存します。

## モバイルサービスAPIキーの設定
API ManagementからモバイルサービスのAPI呼び出しを行う際に、APIキーが必要です。（モバイルサービス側の構成で認証不要にしていれば必要無い）

APIキーの設定はリクエストヘッダーに`X-ZUMO-APPLICATION`を設定します。API Managementにてリクエストヘッダーを設定してAPIキーを入力するには、Policiesを編集します。（最初わからなくて出来ないかと思った）

![kobito.1402417980.266534.png](https://qiita-image-store.s3.amazonaws.com/0/31790/8b7650ad-ecd8-0ea8-fd11-1c3a1f971a83.png "kobito.1402417980.266534.png")

Policy ScopeのAPIでtodoitemsを選択して、Policy definition の`<inbound />`の間に次の値を入れて`Recallulate...`ボタンを押して保存します。

```xml
<set-header name="X-ZUMO-APPLICATION" exists-action="append">
	<value>YOU APLICATION KEY</value>
	<!--for multiple headers with the same name add additional value elements-->
</set-header>
```

![kobito.1402418161.956726.png](https://qiita-image-store.s3.amazonaws.com/0/31790/ba8aeea2-43b5-d67e-7b86-89d0520a3c6d.png "kobito.1402418161.956726.png")

## 開発者ポータルを確認してみる

以上の操作をしてできあがった開発者向けのポータルが https://nnasaki.portal.azure-api.net です。

![kobito.1402418574.565741.png](https://qiita-image-store.s3.amazonaws.com/0/31790/f9b31cce-645a-d991-1418-be63c820df9c.png "kobito.1402418574.565741.png")

先ほど設定したAPIドキュメントは https://nnasaki.portal.azure-api.net/docs/services/2/operations/8 にあります。

![kobito.1402418639.425234.png](https://qiita-image-store.s3.amazonaws.com/0/31790/94809482-0f6a-6963-b710-b25d3872968c.png "kobito.1402418639.425234.png")

## サンプルコード自動生成

面白いのは、各言語ごとにサンプルコードを自動生成してくれます。JavaもあるしCurlのサンプルとかも面白い

![kobito.1402418720.728917.png](https://qiita-image-store.s3.amazonaws.com/0/31790/5c4e9049-c727-934d-2039-ec8fadba5cf5.png "kobito.1402418720.728917.png")
![kobito.1402418752.162788.png](https://qiita-image-store.s3.amazonaws.com/0/31790/9553b5c6-4eb1-792a-1198-cf5475b45728.png "kobito.1402418752.162788.png")

## ブラウザ上でAPIが試せる

さらにOpen Consoleをクリックすると、その場でAPIが試せます。subscription-keyを設定して（ログインしていないと出ない）HTTP GETをクリックする。

![kobito.1402418874.508204.png](https://qiita-image-store.s3.amazonaws.com/0/31790/673835c1-8c24-d874-ab90-3a506e08e78b.png "kobito.1402418874.508204.png")


こんな感じでレスポンスが帰ってきます。  


![kobito.1402418954.778527.png](https://qiita-image-store.s3.amazonaws.com/0/31790/2817e324-63f9-5b3b-b4ed-49323bc2b05e.png "kobito.1402418954.778527.png")


$filterに`complete eq false`といれてHTTP GETしてみます。


![kobito.1402419042.538014.png](https://qiita-image-store.s3.amazonaws.com/0/31790/11a9d3c2-6b52-1af6-fa7d-e10a9c2a1099.png "kobito.1402419042.538014.png")


ちゃんとフィルタリングした結果が帰ってきます。

![kobito.1402419101.345263.png](https://qiita-image-store.s3.amazonaws.com/0/31790/f2ebe9f3-c87b-1afb-c47e-d9def7af3792.png "kobito.1402419101.345263.png")

## まとめ
WEB上でぽちぽちしていくだけでそれっぽい開発者ポータルとAPIドキュメント兼プレイグラウンドが出来てしまいました。ポータルのレイアウトの変更とかもできるし、独自ドメインの設定も出来るようです。

モバイルサービスと組み合わせると、それっぽいWebサービスが１時間かからずにできちゃいますね。恐ろしい世の中です。