APIサービス(Lambda)REST

#APIバックエンドサービスの例としてTODO管理アプリケーションのAPIバックエンドサービスをAPIGateway、Lambda、AmazonDynamoDBを使用して作成する

#REST API
| HTTPのメソッド    |    action          |
|:-----------------|:-------------------|
| ANY　　　　       |        すべてのメソッドをサポートする        |
| DELETE　　        |        リソースの削除        |
| GET　　　         |        リソースの取得        |
| HEAD　　　        |        リソースのヘッダ (メタデータの取得)        |
| OPTIONS　        |        リソースがサポートしているメソッドの取得        |
| PATCH　　        |        リソースの部分的な変更        |
| POST　　　       |        子リソースの作成, リソースへのデータ追加, その他処理　冪等な操作        |
| PUT　　　        |        リソースの作成、リソースの更新, リソースの削除        |

![REST.png](https://qiita-image-store.s3.amazonaws.com/0/347413/50f05d0a-e0fe-1edf-4531-274f93f098aa.png)


REST APIの設計
[CloudFormationのテンプレート(json)](https://awsexperts-apibackend.s3.amazonaws.com/template.json)

Lambdaはnode.js4.3でデプロイできた

#APIGatewayとは
***ロットリン***
***マッピングテンプレート***
***モックアップ機能***
バックエンドよりも先にクライアントの開発を行いたいときに、固定値を返す簡単なAPIを実装することができる
100万回のリクエストで3.5ドル
最大数十万の同時API呼び出しを受け付け処理する

todoIdリソースは{todoId}のようにしパラメータとし扱えるようにする
APIエンドポイント　https://hogehoge-api.us-east-1.amazonaws.com/prod/v1/todos

RESTリクエスト

```
#list_todos
curl https://hogehoge/prod/v1/todos

#get_todo
curl https://hogehoge/prod/v1/todos/(todoId)

#update-todo
curl -X PUT -d '{"finishedAt":20}' -H Content-Type:application/json https://hogehoge/prod/v1/todos/(todoId)

#delete_todo
curl -X DELETE https://(todoId)
#update-todo/prod/v1/(todoId)

#put_list
curl -X POST -d '{"title":"text"}' -H Content-Type:application/json https://(todoId)/prod/v1/todos
```

#認証
主にサーバ間での認証などを想定した認証方式であらかじめ生成したAPIキーをリクエストヘッダー(x-api-key)に含めてアクセスした場合のみ、アクセス許可する
-H x-api-key:
[注意]EC2でのリクエストは応答したがブラウザからは認証されずにリクエストを処理してもらえなかった

#設定方法
・メソッドごとにAPIKeyRequiredを有効化し、再デプロイ
・APIKeyを作成する
UsagePlansでキーの使用プランを作成する(どのキーをしようするか、何度一日にキーの使用を許可するか(クォータ)、1秒あたりにリクエスト数(レート)、短期的な応答(バースト))
(リソース,メソッドごとにスロットリングができるため、会員のランクごとにサービスの差別化できる)

***クォータリミットのエラー***
{"message":"Limit Exceeded"}
***認証のないメソッドを呼び出したときのエラー***
{"message":"Forbidden"}

```
curl https://(API endpoint) /( todoId) -H x-api-key:(API key)
```

設計指針ポイント
PUT
更新成功の場合 → 204 No Content
クライアントにとって思い通りの結果になったということなので、中身は重要ではなく204で十分
DELETE
成功時 → 204 No Content
リソースがないので204が最適
失敗した時
4xxは通知することでクライアントまたはユーザが反応できる可能性があるときに利用する
トークンバケットモデル

[HTTP レスポンスステータスコード
](https://developer.mozilla.org/ja/docs/Web/HTTP/Status)

#各Lambda関数のプログラム
Lambdaのhandlerのeventオブジェクトの中身は、APIGatewayの統合リクエストのマッピングテンプレートで設定したものが渡される
"todoId":"$input.params('todoId')"　=　 event.todoId

***curlコマンド***

```
curl -I https://(APIEndpoint)/prod/v1/todos/(todoId) -H x-api-key:hogehoge
```

#PUT
curl -X PUT –d
--data　 (省略形-d)　 POSTで送信するデータを記述
application/json
{"title":"$input.params('title')"}
--header 　(省略-H) リクエストヘッダを指定する

#その他
[0からREST APIについて調べてみた](https://qiita.com/masato44gm/items/dffb8281536ad321fb08)
RESTful API(REST API)( REpresentational State Transfer)とは、
Webシステムを外部から利用するためのプログラムの呼び出し規約(API)の種類の一つ
RESTful API(REST API)とは、Webシステムを外部から利用するためのプログラムの呼び出し規約(API)の種類の一つ
また、リソースの操作はHTTPメソッドによって指定(取得ならGETメソッド、書き込みならPOSTメソッド)され、結果はXMLやHTML、JSONなどで返される。また、処理結果はHTTPステータスコードで通知するという原則が含まれることもある
[REST APIについて](https://qiita.com/kamihork/items/f9d31c03505028d8a9e9)


#見出し
***強調***
[リンク](http)
```

```