2016-08-02 50 views
0

假設我有一個移動應用程序,android/iOS和一個java Spring後端。鑑於移動連接性,網絡往返次數必須受到限制,理想的情況是每個屏幕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 

談話記錄包含有關發生在這麼一個屏幕,其中列出許多談話只是頭可以展示其最新的內容,而不必查詢實際的消息表的最新消息的一些信息(也消息計數)。

理想會有電話這樣的:

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 

這裏是雖然問題:

問題A) 當並主張一個新的消息,這將創建一個新的信息資源,但它們是(異步/消息)更新對相應'對話'記錄的副作用。因此,發佈typeA的新資源會觸發typeB的另一個資源的PATCH。這可以嗎?

問題B) 定位第一條消息時,還沒有對話記錄。兩者都必須創建,首先是「對話」記錄,然後是包含新對話ID(最好在交易中)的「消息」記錄。如何以休息的方式做到這一點,而不必做2個API調用?

基本上是試圖之間找到正確的折衷:

  • 號休息的要求
  • 複製數據庫字段和查詢
  • 的資源化API

休息風格也許這不是真的有可能不添加某種人爲的新資源或「批次/捆綁/聚合」操作/終點?任何建議表示讚賞,謝謝!

回答

0

我看到一些方法來做到這一點 - 雖然首先我不會擔心在會話表中保留最新的消息。如果消息表被正確索引/存儲,不應該成爲限制因素。

到/ api /會話端點的POST可以是不包含對話ID的消息。該服務能夠創建一個新的會話,並把該消息在新的資源,交談之下:

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

你可以有通話號碼和信息號碼之間另一條路徑,但我沒有看到被需要。

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

我不確定爲什麼你需要一個PATCH來發布,如果你只是不斷地向它的端點添加資源(對話)。