どうせWebアプリケーションを作るのなら、できるだけRESTfulに作りたい、と僕は今でも思っている。
とはいっても、セッションIDをcookieに保存する例のように、あえてRESTのスタイルを崩すべき場合もあろう。
非同期処理についても、RESTにこだわってジョブリソースを云々するより、WebSocketを使って完了をクライアントに伝えるほうが簡単だ。だから、スタイルを崩してWebSocketを使ってよい。
本当にそれでよいのだろうか。気になったので、RESTの提唱者であるRoy T. Fielding氏がWebSocketをどう評価しているのか調べてみた。理解に誤りがあればご指摘いただきたい。
- Re: [hybi] WebSockets (2009-03-30)
- なぜWebページからのプッシュが必要なのか、またなぜそれがHTTP越しでなければならないのか、という根本的な疑問が提示されている。
- rest-discuss : Message: Re: [rest-discuss] Re: Restful Approaches to some Enterprise Integration Problems (2010-07-08)
- まるでDoS攻撃のような接続の張りっぱなしを避けられるようRESTは設計されているのだ、という話。
- blocking Upgrade
- Upgradeヘッダを無効にできる設定項目を、Apache HTTP サーバの開発メーリングリストで提案している。
- 後続のメールでは「I am not planning to implement websockets -- I just want to protect the rest of the server from kids playing with toys.」とまで言っている。
- Re: [hybi] Last Call: <draft-ietf-hybi-thewebsocketprotocol-10.txt> (The WebSocket protocol) to Proposed Standard (2011-09-01)
- ここでもDoS攻撃との類似性が指摘されている。
ご覧のとおり、REST (HTTP) とWebSocketの性質の違いは明らかだ。RESTの利点をWebSocketが殺してしまうのだから、cookieほど簡単には採用するわけにはいかない。
逆にいえば、WebSocketを使いたくなるようなアプリケーションならば無理にRESTfulにする必要はないし、そもそも「Web」アプリケーションにすべきなのかどうかも検討したほうがよいということだろう。
ちなみに、WebSocketが80番と443番のポートを使うことになったのは、IANAにそうしろと言われたからだそうだ。
IANA told me to use ports 80 and 443 for WebSocket. See IANA ticket #257455. (I had originally requested new ports, ideally 81 and 815.)