[英]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;
我的問題是
至於我,看起來動詞應該是 PATCH 以防我們期望部分數據,即僅更改
無法決定我是否應該同意並接受新方法,或者用 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.