Amazon API GatewayでMockを定義してみる


#はじめに
9/1にAmazon API Gatewayのエンハンスがあり、API Gatewayから直接Mockの値をレスポンスすることができるようになりました([Introducing Mock integration: generate API responses from API Gateway directly](https://aws.amazon.com/about-aws/whats-new/2015/09/introducing-mock-integration-generate-api-responses-from-api-gateway-directly/))。

これまではバックエンドの実装が終わっていないとAPI Gatewayで作ったAPIを利用したアプリの開発に難しい、もしくは手間がかかる状態でしたが、今回の機能追加によりバックエンドの実装を待つことなくAPIを利用したアプリの開発に着手できます。

というわけで実際にやってみます。とても簡単です。

#やってみる
##APIの作成
まずAPIを作成します。マネージメントコンソールからAPI Gatewayを選択して、「Create API」します。名前は適当につけて「Create API」を押します。ちなみに"Do not clone from existing API"と表示されてるかも知れませんここは気にせずこのままで。既存のAPIがあったらクローンして新規APIを作ることも可能なんです。

![Screen Shot 2015-09-02 at 10.57.43 AM.png](https://qiita-image-store.s3.amazonaws.com/0/30135/f2715956-66e5-a3d7-6e1c-4d72a3fc171d.png "Screen Shot 2015-09-02 at 10.57.43 AM.png")

##リソース作成
まずはリソースを作成します。

![Screen Shot 2015-09-02 at 11.01.25 AM.png](https://qiita-image-store.s3.amazonaws.com/0/30135/f361a913-4cbf-0ca6-eb4f-9e311ded7ef2.png "Screen Shot 2015-09-02 at 11.01.25 AM.png")

今回はbooksというリソースを作成します。ちなみに`RESTおじさん`としてはリソース名は複数形にするのをオススメします。

![Screen Shot 2015-09-02 at 11.03.24 AM.png](https://qiita-image-store.s3.amazonaws.com/0/30135/eb2ce242-c7e8-9438-b041-0d7309ccdf95.png "Screen Shot 2015-09-02 at 11.03.24 AM.png")

##メソッドの設定
###メソッド作成
リソースを作成すると左側のResourcesペインに作成したリソースが表示されていますのでこれを選択した状態で、

![Screen Shot 2015-09-02 at 11.05.25 AM.png](https://qiita-image-store.s3.amazonaws.com/0/30135/34cd5baa-34d1-08a4-e034-5f733a588aab.png "Screen Shot 2015-09-02 at 11.05.25 AM.png")

「Create Method」します。
![Screen Shot 2015-09-02 at 11.06.27 AM.png](https://qiita-image-store.s3.amazonaws.com/0/30135/9c9ef080-49e3-918e-12cc-869309de4573.png "Screen Shot 2015-09-02 at 11.06.27 AM.png")

そうするとResourcesペインにHTTPメソッドのリストが出るので今回は「GET」を選択して（①）横のチェックをクリック（②）します。

###Integration Typeの設定
![Screen Shot 2015-09-02 at 11.07.54 AM.png](https://qiita-image-store.s3.amazonaws.com/0/30135/9a3a5431-27c4-3779-d2a3-e5c466ae98dd.png "Screen Shot 2015-09-02 at 11.07.54 AM.png")

続いてメソッドのセットアップ画面でIntegration Typeとして新たに追加されたMock Integrationを選択して保存。

![Screen Shot 2015-09-02 at 11.14.40 AM.png](https://qiita-image-store.s3.amazonaws.com/0/30135/fb4d6964-1624-8d3c-202a-b14341040296.png "Screen Shot 2015-09-02 at 11.14.40 AM.png")

Integration RequestのtypeがMockになってますね。

###Mockのステータスコードの設定
Integration RequestでMockでレスポンスする際のステータスコードを設定します。
ここのステータスコードはあくまでもバックエンドのMockとしてのステータスコードなのでユーザに直接レスポンスするものではないです。
このあたりは後述のMethod ResponseとIntegration Responseあたりで設定する必要があります。

![Screen Shot 2015-09-02 at 11.21.29 AM.png](https://qiita-image-store.s3.amazonaws.com/0/30135/e8ebc76e-d113-e155-765c-26513817bade.png "Screen Shot 2015-09-02 at 11.21.29 AM.png")

実際の定義はMapping Templateを利用して行います。

![Screen Shot 2015-09-02 at 11.25.43 AM.png](https://qiita-image-store.s3.amazonaws.com/0/30135/9f3614dc-3199-8543-bfac-5240889b226f.png "Screen Shot 2015-09-02 at 11.25.43 AM.png")

Content-Typeのところのapplication/jsonをクリックするとその右側にTemplateを記述するエリアが表示されます。Integration TypeとしてMockを選択した場合はあらかじめステータスコードに関するテンプレートが記述されています。ひとまず、今回はリクエストされたら常に200を返すようにするのでこのままでいいです。本来はここでパラメータとかに応じてレスポンスするステータスコードを変更したりできます。

![Screen Shot 2015-09-02 at 12.57.46 PM.png](https://qiita-image-store.s3.amazonaws.com/0/30135/9cc83c23-fa25-f63e-5e3c-2aeabd122917.png "Screen Shot 2015-09-02 at 12.57.46 PM.png")

###レスポンス内容のMock定義
続いて、実際にレスポンスするMockの中身を定義していきます。Integration Responseを開いて、デフォルトで定義されているステータスコード200のレスポンスの行を展開する（①）と表示されるMapping Templateをクリックして（②）、デフォルトで定義済みのContent-Typeであるapplication/jsonをクリックします（③）。

![Screen Shot 2015-09-02 at 1.16.58 PM.png](https://qiita-image-store.s3.amazonaws.com/0/30135/d89b2058-c66f-c7dc-1578-71b9277cdaea.png "Screen Shot 2015-09-02 at 1.16.58 PM.png")

![Screen_Shot_2015-09-02_at_1_21_04_PM.jpg](https://qiita-image-store.s3.amazonaws.com/0/30135/242ab358-d972-dd35-f491-7121e71a6620.jpeg "Screen_Shot_2015-09-02_at_1_21_04_PM.jpg")

標準状態だとOutput passthroughとなっているのでその右にある鉛筆アイコンをクリックします。
![Screen_Shot_2015-09-02_at_1_29_55_PM.jpg](https://qiita-image-store.s3.amazonaws.com/0/30135/eb2cf611-d45e-5282-1d31-e38d2537cb89.jpeg "Screen_Shot_2015-09-02_at_1_29_55_PM.jpg")

そうすると変更ができるのでMapping Templateを選択します。

![Screen_Shot_2015-09-02_at_1_33_02_PM.jpg](https://qiita-image-store.s3.amazonaws.com/0/30135/2e267c2b-a09d-3eda-1c9d-47157ee65dba.jpeg "Screen_Shot_2015-09-02_at_1_33_02_PM.jpg")


Mapping templateを選択すると画面下部にTemplateを記述するエリアが表示されるのでそこに以下の内容を記述します。
今回はシンプルに/booksにGETリクエストされたら本のIDと名前のリストを含む以下のようなJSONを返すこととします。

```
{
 [
  {
   "id":1,
   "title":"RESTful Webサービス"
  },
  {
   "id":2,
   "title":"Web API: The Good Parts"
  },
  {
   "id":3,
   "title":"Restlet in Action"
  },
  ]
}
```

先ほどのテンプレートの記述エリアに上記をコピペしてsaveしてください。

![Screen_Shot_2015-09-02_at_1_45_15_PM.jpg](https://qiita-image-store.s3.amazonaws.com/0/30135/dca2f3e2-1d0b-f2c7-3c33-d2117b2f99f1.jpeg "Screen_Shot_2015-09-02_at_1_45_15_PM.jpg")

これで完了です。

#テスト
テストはマネージメントコンソール上でのテストでもデプロイしてからブラウザ等により実際にリクエストしてみるのもどちらでも構いません。ちなみにマネージメントコンソール上でのテストはデプロイする前でも可能です。今回はマネージメントコンソール上でテストしてみます。

リソースのMethod Executionの画面を開きます。左側にTestというリンクがあるのでこれをクリックします。

![Screen_Shot_2015-09-02_at_2_06_53_PM.jpg](https://qiita-image-store.s3.amazonaws.com/0/30135/bbc5f592-038d-6cc6-234d-444f80a98a9d.jpeg "Screen_Shot_2015-09-02_at_2_06_53_PM.jpg")

そうすると、テストの際に渡すパラメータの設定とかを行う画面が表示されます。今回はデフォルトのままでクエリパラメータとか何も受け取らない設定になっているのでここには何も表示されていません。

![Screen Shot 2015-09-02 at 2.07.10 PM.png](https://qiita-image-store.s3.amazonaws.com/0/30135/7487ade0-993b-546b-22e7-f6161b655195.png "Screen Shot 2015-09-02 at 2.07.10 PM.png")


ではTestボタンを押してみてください。そうすると結果が表示されます。

![Screen Shot 2015-09-02 at 2.07.32 PM.png](https://qiita-image-store.s3.amazonaws.com/0/30135/6337a43a-10e0-0444-0980-9e32e3bd9f3d.png "Screen Shot 2015-09-02 at 2.07.32 PM.png")

先ほどIntegration ResponseのMapping Templateで指定したJSONがそのまま出力されました！

#終わりに
というわけで以前とくらべてAPI Gatewayを使ったアプリ開発を複数グループで平行して進めたり、ちょっとした何かをテストするために利用するのが簡単になったのではないかなーと思います。
ちなみにレスポンスする際のMockはステータスコードごとに設定できますので、例えば特定パラメータを渡した場合はステータスコードが400になって特定のエラーメッセージを返すというようなこともできます。

**免責
こちらは個人の意見で、所属する企業や団体は関係ありません。**