3 回答

TA貢獻1936條經驗 獲得超7個贊
根據HTTP 規范,您應該始終擁有一個狀態為 200 的正文。
10.2.1 200 正常
請求已成功。響應返回的信息取決于請求中使用的方法,例如:
GET 在響應中發送與請求的資源對應的實體;
HEAD 請求資源對應的實體頭字段在響應中發送,不帶任何消息體;
POST 描述或包含操作結果的實體;
TRACE 包含終端服務器收到的請求消息的實體。
您應該改用狀態 204(無內容),它不帶正文參數。
10.2.5 204 無內容
服務器已完成請求,但不需要返回實體主體,并且可能希望返回更新的元信息。響應可能包括實體頭形式的新的或更新的元信息,如果存在,應該與請求的變體相關聯。
如果客戶端是用戶代理,它不應該改變導致請求被發送的文檔視圖。這個響應主要是為了允許輸入動作發生而不導致用戶代理的活動文檔視圖發生變化,盡管任何新的或更新的元信息應該應用于當前在用戶代理的活動視圖中的文檔。
204 響應不能包含消息體,因此總是由頭字段之后的第一個空行終止。
transactionNotesService.delete(Long.valueOf(id)); return ResponseEntity.noContent().build();

TA貢獻1817條經驗 獲得超14個贊
這里的問題是您混淆了 ResponseEntity.ok() 和 ResponseEntity.ok(T t) 其中 t 是您希望返回的內容。
如果 transactionNotesService.delete 或 notFound().build 具有 void 作為返回類型,那么您不能將它們用作返回值,因為它們沒有值。我猜你的意思是這樣的:
@DeleteMapping("remove/{id}")
public ResponseEntity<?> remove(@PathVariable String id) {
transactionNotesService.delete(Long.valueOf(id));
return ResponseEntity.noContent();
}

TA貢獻1815條經驗 獲得超13個贊
在您的情況下,您可能會返回 200 或 204(202 用于異步/正在進行的刪除),如MDN 文檔所述:
如果成功應用 DELETE 方法,則可能有幾個響應狀態代碼:
如果操作可能會成功但尚未執行,則為 202(已接受)狀態代碼。
204(無內容)狀態代碼,如果已執行操作且無需提供更多信息。
200(OK)狀態碼,如果動作已經執行并且響應消息包含描述狀態的表示。
對于204
你想要的是:
return ResponseEntity.noContent().build();
例如200
,您想要的是:
return ResponseEntity.ok("Entity deleted");
代碼更改返回204
在您的實際代碼中,該orElseGet()
部分不應編譯,因為ok()
不返回Optional
.
要處理客戶端傳遞的 id 與任何現有實體沒有任何匹配的情況,您可以捕獲EmptyResultDataAccessException
由JpaRepository.deleteById()
.
例如 :
@DeleteMapping("remove/{id}")
public ResponseEntity<?> remove(@PathVariable String id) {
try{
transactionNotesService.delete(Long.valueOf(id));
return ResponseEntity.noContent().build();
}
catch (EmptyResultDataAccessException e){
return ResponseEntity.notFound().build();
}
}
添加回答
舉報