我正在构建宁静的Web服务。对于放置请求,我首先在pathvariable中找到具有id的testBean。如果它不存在,那么我创建一个新的。我想知道在这里创建一个新文件是否正确,否则我应该抛出异常。因为id是自动递增的,所以如果我创建一个新的TestBean,则保存在数据库中的id与url path参数中的ID是不同的。
@PutMapping("/Test/{id}")
public TestBean updateTestBean(@PathVariable long id, @RequestBody TestBean newTestBean) {
return testBeanService.getTestById(id)
.map(testBean -> {
testBean.setBRR(newTestBean.getBRR());
testBean.setModifiedDate(newTestBean.getModifiedDate());
return crewsBeanService.saveTestBean(testBean);
})
.orElseGet(() -> {
newTestBean.setId(id);
return testBeanService.saveTestBean(newTestBean);
});
}
我总是喜欢保持PUT方法幂等。幂等性可以解释为您执行某个“操作”多少次,其结果将与第一次相同。由于REST只是一种样式,因此它取决于您,但是我总是会问我,将操作保持为PUT还是POST是否有意义。
如果您的服务的客户不耐烦并且在服务第一个请求时多次访问您的PUT服务,该怎么办?您可能最终创建了两个用户。因此,如果ID不存在,则引发异常是有意义的。
可以是400或404,我不喜欢404,但更喜欢400,原因如下:
1)如果资源错误或它们使用的ID错误,则会混淆您的API的客户端。
(您总是可以区分错误响应并提供有意义的信息,但是我不喜欢!)
2)通过使用404,
您是在告诉用户问题可能是永久性或临时性的
,例如,假设您的服务未在发现服务器(eureka)中正确注册或崩溃,发现服务器将发送404,直到您解决问题为止。
通过使用400,
您要求用户尝试使用不同的输入(在这种情况下,使用不同的ID)。这是永久的...
正如您所说的,id是自动递增的,并且客户端无法确定该值,因此,直到用户通过返回并要求您的POST服务提供新ID来解决问题之前,该请求为“ BAD”并且无法处理。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句