簡體   English   中英

Rest API PUT/PATCH 方法應模型包含完整數據或僅反映更改

[英]Rest API PUT/PATCH method should the model contain the full data or reflect only changes

讓我們想象一下客戶模型看起來是這樣的:

Customer{

 public int Id {get;set;}
 public string FirstName {get;set;}
 public string LastName{get;set;}
 public Company {get;set;}

}

GET 端點如下所示:

[HttpGet, Route("{id}")]
GetById(int id)
 var entity = dataService.GetById(id);
 var model = Mapper.Map<Entity,Customer>(entity, model);
 return model;

get端點提供的模型數據:

 {{ Id: 1, FirstName : 'John', LastName:'Dow', Company: {...} }}

假設用戶只編輯了名字:

{{ Id: 1, FirstName : 'Mike', LastName:'Dow', Company: {...} }}

PUT 端點(經典的 .net 方法):

[HttpPut, Route("{id}")]
Update(int id, Customer model)

模型數據預計為

{{ Id: 1, FirstName : 'Mike', LastName:'Dow', Company: {...} }}

但是我的端點前端只提交了數據更改,即用戶編輯的屬性其余​​為空或 0:

{{ Id: 0, FirstName : 'Mike', LastName: null, Company: null }}

[HttpPut, Route("{id}")]
Update(int id, Customer model) // where model means changes-only

所以后端應該為每個屬性設置 if 條件來進行從模型到實體的映射:

if(model.FirstName !=null)
   entity.FirstName  = model.FirstName;


if(model.LastName !=null)
   entity.LastName = model.LastName;

我的問題是

  1. 從 REST API 的角度來看,PUT 端點是否說什么模型應該包含完整數據或部分數據(更改)也是可能的?

至於我,看起來動詞應該是 PATCH 以防我們期望部分數據,即僅更改

  1. 你現在使用哪種方法? - 第二個對我來說似乎是新事物,但由於許多 if 語句而聞起來很臭。 我想知道 .NET 核心團隊最近是否引入了它,或者它是從前端進入 .NET 世界的。

無法決定我是否應該同意並接受新方法,或者用 if 語句說不這種氣味讓我發瘋=))

給定表示的成功 PUT 將表明對同一目標資源的后續 GET 將導致在 200(OK)響應中發送等效表示。 -- RFC 9110

所以

PUT /customer/2
Content-Type: application/json

{{ Id: 0, FirstName : 'Mike', LastName: null, Company: null }}

意思是“使 /customer/2 的表示看起來像這個文檔(帶有空值和零 id)”,就像它對 Internet 上的任何其他資源的含義一樣。 這就是“統一界面”的全部意義——每個人都以同樣的方式理解相同的信息。

服務器對請求所做的是一個實現細節,不受 HTTP 限制(請記住,服務器對因偏離標准含義而導致的任何 財產損失負責)


如果請求的意圖是對資源表示的部分更改,並且您希望通用組件理解消息,那么您應該使用補丁文檔的表示來描述更改(例如:application/merge-patch +json),並使用 PATCH 方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM