#REST-APIとWebsocket
AWSのサーバレスアーキテクチャを構築する上で欠かせないAPIGatewayのBlackBeltを読んで、APIGatewayの2大主要機能であるREST APIとWebsocketについて理解を深めてみようと思う。APIGatewayのBlackBeltを読んで「REST」と「Websocket」が2つ比較で並べられて説明されており、少し違和感を覚えたので、ちょっと記事を書いている。
###REST-APIとは?
APIGatewayは「REST API」を作成することできる。REST-APIとは、Restfulな設計原則に基づいているAPIだよ!ということだ。Restfulって何って話だが、下記を満たす設計原則のことだ。プログラムを書くときにリターンコードに無意識に200としたりしていないだろうか?それはRestfulな設計原則が身についているからかも?
・アドレス指定可能なURIで表現できること
・インターフェース(HTTPメソッドの利用)の統一がされていること
・ステートレスであること
・情報の内部に、別の情報や(その情報の別の)状態へのリンクを含めることができること
####ステートレスって?
ステートレスとは、状態に関わらず同じリクエストであれば同じ応答をするということだ。Webページの閲覧(HTTPプロトコルでGetする)はいつも同じ応答なので、ステートレスだ。セッションなどの状態管理を行わない。HTTPリクエストとHTTPレスポンスでやり取りされる情報はそれ自体で完結して解釈することができる。なお、CookieやSessionStorageで応答が変わるというのは、HTTPプロトコルで定義されているものではないので、HTTPプロトコルとその他の機能を利用してステートフルな仕組みを実現している。
###WebSocketとは?
Websocketが使われているのは、チャットアプリなどだ。他の人の発言がリクエストしていないにも関わらず表示されるのは、クライアントとサーバ間で通信が一定時間確保された状態にあり、1リクエストに対して1つレスポンスを返すのではなく、双方向の通信ができる。強調したいのは、Websocketは通信プロトコルということだ。チャットアプリを開く(リクエスト)たびに、別の人が発言をしたり、毎回応答が変わる。状態によって応答が変わる「ステートフル」だ。
REST-APIは、HTTPプロトコルを利用して「ステートレス」な通信を行う、Websocketは、Websocketプロトコルを利用して「ステートフル」な通信を行うという意味では対比できるものかもしれないが、RESTとWebsocketという言葉自体は対比するものではない。
WebsocketはTCP/IPに適合するプロトコルだ。というのは、TCPというのは、3ハンドシェイクという相手が通信できるか確認してから通信を始めるプロトコルであるため、Websocketの双方向通信と相性よさそう!ってのは何となくイメージできる。BlackBeltに「HTTP上」でクライアント間と双方向通信が可能とあるが、その表現はちょっと違うんじゃないかなと思っている。ブラウザがHTTPプロトコルに対応しているので、HTTPと同じ形式でリクエストして、Websocket使える?って聞いてるのだ(たぶん。間違ってたら教えてください)
そんな便利なWebsocketAPIをAWSのAPIGatewayではサーバレスで構築することができる。下記のソースを利用してCloudFormarionでAPIGatewayとLambdaをデプロイすると、Websocket通信を簡単に体感できるので、ぜひ試してみてほしい
chat-app-sample
####参考文献