2016-08-02 9 views
0

私はモバイルアプリ、アンドロイド/ iOSとjava Springバックエンドを持っているとしましょう。モバイル接続を考えると、ネットワーク往復の回数は制限されなければなりません。理想的には、1画面につき1以下です。他のリソースに副作用があるAPIコールを外す

ここで、2人以上のアプリユーザーがお互いにメッセージを送信できるときに、いくつかのメッセージング機能を追加/書き換えたいとします。

2つのテーブル/リソース(ここでは簡略化)があります。 「会話」と「メッセージ」。各会話には複数のメッセージが含まれています。

conversation 
----------------- 
id 
type 
last_message_test 
last_message_username 
message_count 
etc 

message 
------------ 
id 
conversation_id 
user_id 
user name 
text 
timestamp 

会話記録は、多くの会話のちょうどヘッダを一覧画面は、実際のメッセージテーブルを照会することなく、最新のコンテンツを表示できるようにして行われた最新のメッセージ(また、メッセージに関するいくつかの情報が含まれていますカウント)。このような

理想的に存在することになるのコール:

問題A)新しいメッセージをポジショニングするとき が、これは新しいメッセージ・リソースを作成しますが、その次のとおりです。ここで

POST /api/conversation         => create a new conversation 
POST /api/conversation/1234/message     => post a new message in conversation 1234 
GET /api/conversation?searchparam1=1&searchparam2=2 => retrieve certain conversation without their full actual content 
GET /api/converstaion/1234/message     => retrieve all the messages of a given conversation, 1234 

はしかし、問題となっています対応する「会話」レコードに対する(非同期/メッセージング)更新の副作用でもあります。したがって、typeAの新しいリソースをPOSTすると、typeBの別のリソースのPATCHingがトリガーされます。それは大丈夫ですか?

問題B) 最初のメッセージを送信するとき、まだ会話レコードはありません。どちらも作成する必要があります。最初に「会話」レコード、次に新しい会話ID(理想的にはトランザクション内)を含む「メッセージ」レコードです。 2つのAPI呼び出しを行うことなく安心してやり遂げるには?残りの

  • 数が
  • 重複デシベルフィールドを呼び出し、リソース指向API

  • 残りスタイルはたぶん、それはありません照会:基本的に間の右の妥協点を見つけようとし

    何らかの人為的な新しいリソースや 'バッチ/バンドル/集約'操作/エンドポイントを追加しなくても本当に可能ですか?任意の推奨は、ありがとう!

  • 答えて

    0

    これはいくつかの方法がありますが、最初は会話テーブルに最新のメッセージを保存することについて心配していません。メッセージテーブルが正しく索引付け/格納されている場合は、制限要因ではないはずです。

    /api/conversationエンドポイントへのPOSTは、会話IDを含まないメッセージにすることができます。サービスは、新しい会話を作成し、その会話の下に新しいリソースにメッセージを置くことができます。

    /api/conversation/12345/1 <---- so message #1 on conversation #12345 
    

    あなたは会話の番号とメッセージ番号の間に別のパスを持っている可能性がありますが、私は必要とされていることがわかりません。

    /api/conversation/12345?param=1 <---- better 'search' endpoint 
    

    私はちょうどそれがエンドポイントだからリソース(会話)を追加し続けるならば、あなたが発行するPATCHを必要とする理由はわかりません。

    関連する問題