亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

發送 DELETE 時實現狀態 200

發送 DELETE 時實現狀態 200

桃花長相依 2022-05-25 17:46:10
我想用 Spring Boot 實現 DELETE 請求。我試過這個:@DeleteMapping("remove/{id}")    public ResponseEntity<?> remove(@PathVariable String id) {        return ResponseEntity.ok(transactionNotesService.delete(Long.valueOf(id)))                .orElseGet(() -> notFound().build());    }但我明白了The method ok(T) in the type ResponseEntity is not applicable for the arguments (void)。執行 DELETE 時如何修改代碼以返回代碼 200?
查看完整描述

3 回答

?
LEATH

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();


查看完整回答
反對 回復 2022-05-25
?
大話西游666

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();

}


查看完整回答
反對 回復 2022-05-25
?
蕭十郎

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 與任何現有實體沒有任何匹配的情況,您可以捕獲EmptyResultDataAccessExceptionJpaRepository.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();

  }                                

 }


查看完整回答
反對 回復 2022-05-25
  • 3 回答
  • 0 關注
  • 209 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號