web-dev-qa-db-ja.com

Socket.ioとRESTFulはどのように連携できますか?

(私はRESTFulに慣れていません。私の概念が間違っている場合は修正してください)

RESTFulアーキテクチャでは、すべてのアクションをURLにマッピングします。 [記事を投稿]をクリックすると、実際にはURL _http://example.com/_および一部のデータ_action=post&content=blahblah_である可能性があります。

投稿したいがWebページ全体を更新したくない場合は、JavaScriptのXMLHTTPRequestを使用できます。投稿してコンテンツを取得し、ページのdivに挿入します。これらのアクションはすべて非同期です。

次に、WebSocketという名前のものがあり、それはラッパー_socket.io_です。クライアントとサーバー間の通信に「メッセージ」を使用します。 「投稿」をクリックすると、クライアントはsocket.send(data)を呼び出し、サーバーのclient.send(data)を待ちます。それは魔法です。しかし、URLはどうですか?

自分自身を繰り返さなくても、2つのモデルを両方使用することは可能ですか?言い換えれば、すべてのアクションにはURLがあり、それらの一部はリアルタイムで(socket.ioによって)ユーザーと対話できます。

また、これを行う必要がありますか?非常にインタラクティブなWebプログラム(ゲームなど)では、RESTFulはまだ意味がありますか?

36
Lai Yu-Hsuan

REST over http。POSTにマップするアクションのハンドラを定義しています。GETは通常、エンティティに対する更新とクエリを指します。理由はまったくありません。両方のコンテキストで使用できるこれらのCRUD操作の汎用バージョンのハンドラーを定義するだけではありません。一般的に、これを行う方法は、リアルタイム転送に「ルート」の概念を導入し、それらをマッピングして戻すことです。同じCRUDハンドラに。

セッションがあり、同じACLを課すことができます。

 +---------------------------------+
 |                                 |
 |      BROWSER                    |
 |                                 |
 +--+--^-------------------+---^---+
    |  |                   |   |
    |  |                   |   |
 +--v--+---+            +--v---+---+
 |         |            |          |
 | HTTP    |            | SOCKET.IO|
 +--+---^--+            +--+---^---+
    |   |                  |   |
 +--v---+------------------v---+---+
 |                                 |
 |        ROUTING/PUBSUB           |
 +-+--^-------+--^-------+--^------+
   |  |       |  |       |  |
 +-v--+--+  +-v--+--+  +-v--+-+
 |       |  |       |  |      |
 | USERS |  | ITEMS |  |ETC   |
 +-------+  +-------+  +------+
     ENTITY CRUD HANDLERS
38
Josh

これを私のブログに投稿しました 最近:

WebSockets用のCRUD APIの設計

Weld を構築するとき、RESTとWebSockets(Socket.io)の両方を使用しています。WebSocketに関する3つの観察:

  1. WebSocketは非常に自由形式であるため、イベントに任意の名前を付けることができますが、最終的にはデバッグできなくなります。
  2. WebSocketには、リクエスト/レスポンス形式のHTTPがないため、イベントがどこから来ているのか、どこへ行くのかを判断するのが難しい場合があります。
  3. REST APIと同じコントローラーを使用して、WebSocketがアプリ内の既存のMVC構造に適合できるとしたら、いいですね。

私の解決策:

  • サーバーに2つのルーティングファイルがあります:routes-rest.jsroutes-sockets.js
  • 私のイベントは次の例のようになります:"AppServer/user/create"
  • スラッシュ(「/」)を使用して、イベントをルーティングパスのように見せます。
  • 最初の文字列は、targetです(これが実際にパスの場合は、「ホスト名」)。
  • 2番目の文字列はmodelです。
  • 3番目の文字列はCRUD動詞です。つまり、作成、読み取り、更新、削除です。
34
Tom Söderlund