我想用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?
答案 0 :(得分:5)
根据HTTP Spec,您应该始终拥有状态为200的身体。
10.2.1 200 OK
请求成功。响应返回的信息取决于请求中使用的方法,例如:
在响应中发送与所请求资源相对应的实体;
HEAD,在没有任何消息正文的情况下,在响应中发送与所请求资源相对应的实体标头字段;
发布一个描述或包含操作结果的实体;
跟踪包含最终服务器接收到的请求消息的实体。
您应该改用状态204(无内容),该状态不包含主体参数。
10.2.5 204无内容
服务器已完成请求,但不需要返回实体,可能要返回更新的元信息。响应可以以实体标题的形式包含新的或更新的元信息,如果存在,则应与所请求的变体相关联。
如果客户端是用户代理,则不应更改导致发送请求的文档视图。该响应的主要目的是允许输入操作,而不会导致更改用户代理的活动文档视图,尽管任何新的或更新的元信息都应应用于当前在用户代理的活动视图中的文档。
204响应必须不包含消息正文,因此始终由标头字段之后的第一个空行终止。
transactionNotesService.delete(Long.valueOf(id));
return ResponseEntity.noContent().build();
答案 1 :(得分:1)
您还可以避免不必要的Long.valueOf(id)
Spring可以自动解析它:
public ResponseEntity<?> remove(@PathVariable Long id)
答案 2 :(得分:1)
这里的问题是,您混淆了ResponseEntity.ok()和ResponseEntity.ok(T t),其中t是您希望返回的值。
如果transactionNotesService.delete或notFound()。build的返回类型为void,则您不能将它们用作返回值,因为它们没有值。我猜你的意思是这样的:
string folderfile = "C:\\Screenshots";
CreateDirectory(LPCTSTR(folderfile.c_str()), NULL);
答案 3 :(得分:1)
根据您的情况,您可能会返回200或204(202为异步/进行中的删除),如the MDN documentation所述:
如果成功应用了DELETE方法,则会有多个响应 状态代码可能:
202(接受)状态码,如果操作可能成功但具有 尚未颁布。
A 204(无内容)状态码(如果已执行操作且没有) 将提供进一步的信息。
一个200(OK)状态码(如果已执行操作和响应) 消息中包含描述状态的表示。
对于204
,您想要的是:
return ResponseEntity.noContent().build();
例如,对于200
,您想要的是:
return ResponseEntity.ok("Entity deleted");
更改代码以返回204
在您的实际代码中,orElseGet()
部分不应该编译,因为ok()
不返回Optional
。
要处理客户端传递的id与任何现有实体都不匹配的情况,可以捕获EmptyResultDataAccessException
抛出的JpaRepository.deleteById()
(RuntimeException子类)。
例如:
@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();
}
}