2016-07-05 16 views
0

我會盡量使這個儘可能簡單,這可能是一個愚蠢的問題。REST:如何更新一行並在同一請求上創建零個或多個其他資源?

我正在重寫一個7歲的web應用程序(幫助臺軟件)。它需要使其成爲REST API才能被不同客戶端的Web瀏覽器和移動應用程序使用。也需要保持業務邏輯儘可能接近原來的工作狀態,而這些工作現在一直運行良好。

關於REST目前的鬥爭:

我需要的是更新的資源可以說/tickets/47321

如果該資源的status_id改變這種變化的記錄需要保存,無論是在同一個數據庫交易中,因爲它需要是全或無。這是原始應用程序的工作方式,我們希望保持這種行爲。

所以問題是:

我可以PUTtickets/47321整個資源或部分狀態表示更新的資源駐留在服務器並創建歷史變化的新紀錄(如果status_id是不同的)和返回他們兩個回客戶端爲JSON:

{ 
    ticket: {}, // new ticket state 
    history: {} // the new created record of history change 
} 

通過這種方式,客戶端可以更新ticket並添加歷史的歷史變化的名單,如果有任何存在的回報?

+0

是的,你可以這樣做。在Java中,一些輕量級的REST框架包括Restlets和JAX-RS,而Spring則是一個很好的方面。 –

+0

那麼這種行爲在REST API中是否正常呢?如何在'PUT'上發送部分表示而不是更新整個資源? –

+0

爲什麼要發送部分表示? –

回答

0

技術上,是的,你可以做到這一點。然而,它可能並不像簡單地將兩個對象並排返回一樣簡單;查看Richardson Maturity Model (Level 1),在調用(PUT)api端點後,人們會期望在接收到相同類型的資源後收到相同類型的資源 。這就是說,你可以嵌入額外的資源(追加Hypertext Application Language(HAL)提議的draft規範),或者更好的(如果你的目標是REST級別3),可以嵌入額外的資源提供從售票的鏈接關係,在符合「目標IRI」在網絡中定義鏈接規範(RFC 5988):

  • /api:history?ticketId=47321將返回所有歷史記錄屬於該票,分頁和創建日期排序,例如(你可以選擇最新的)
  • /api:history?id=123你會做的服務器上的一些工作,以確保這點直奔最新歷史記錄(有關該票ID)

關於部分更新,看着RFC 6902(定義修補程序標準),從客戶端的角度來看,API可以被稱爲像

PATCH /ticket/47321 

[ 
    { "op": "replace", "path": "/author", "value": "David"}, 
    { "op": "replace", "path": "/statusId", "value": "1"} 
] 

更多的例子可以發現here

+0

看來這一切都很好,但對於每個操作的補丁尋址也很麻煩 –

相關問題