为了账号安全,请及时绑定邮箱和手机立即绑定

发送 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条经验 获得超6个赞

根据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 关注
  • 173 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信