考慮一個用于土豆的 ASP.NET 控制器。它有一個用于洗掉操作的端點。
[HttpDelete("{potatoId:long}")]
public async Task<IActionResult> DeletePotato([FromRoute] long potatoId, CancellationToken ct)
{
var result = _potatoService.Delete(potatoId, ct);
return Ok();
}
它使用 _potatoService 執行洗掉操作。現在可能發生兩件事:
- 土豆不存在(我們應該回傳 404)
- 土豆洗掉成功(應該回傳204)
我的問題是 _potatoService 應該回傳什么樣的回應,以便控制器確定操作結果。
一個狀態碼物件?但是系統的其他不知道 Microsoft.AspNetCore.Mvc 物件的部分可能會請求此服務。
狀態碼整數?但是系統的其他部分再次必須依賴這個整數回應才能找出結果
自定義物件/列舉?如果是這樣,我不確定最佳做法是什么。
uj5u.com熱心網友回復:
一種方法是使服務方法和控制器方法都具有冪等性。在這種情況下,這意味著無論物體是否存在,“洗掉”物體都會回傳相同的結果。
一、土豆服務回傳什么?它不需要回傳任何東西。假設它是異步的,它可能是
async Task Delete(potatoId, ct);
有兩種可能的結果。
- 該方法不會引發例外。該專案存在并已被洗掉,或者它不存在。結果是一樣的。
- 該方法引發例外。
控制器回傳什么?如果成功則回傳 204,如果洗掉失敗則回傳 500。
把它想象成做更新。假設您將土豆的名稱更新為“Awesome potato”。如果成功,則回傳 200 或 204。
但是如果土豆已經有了這個名字呢?你會回傳錯誤嗎?不,您會回傳相同的結果,因為無論名稱是否更改,結果都是相同的。它現在有了這個名字。
這是冪等性的簡短版本。重復的請求不會導致不必要的錯誤。在上述情況下,沒有理由回傳錯誤。如果用戶嘗試更新不存在的土豆或在不允許的情況下創建重復的土豆,這些將是回傳錯誤的原因。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/526121.html
