【发布时间】:2023-01-24 11:35:13
【问题描述】:
根据RFC 2616,尝试正确实施Put。
“PUT 方法请求将封闭的实体存储在 提供的请求 URI。如果 Request-URI 指的是一个已经存在的 资源,封闭的实体应该被认为是一个修改过的 驻留在源服务器上的版本。如果请求 URI 不指向现有资源,并且该 URI 能够 被请求用户代理定义为新资源, 原始服务器可以使用该 URI 创建资源。”
简而言之,如果资源存在,则对其进行修改;如果不存在,则根据提供的
id创建。 现在我有了这样的实现,RFC 2616声明当创建元素时,它还必须返回位置 URI。 而我就这样离开了。@PutMapping("/{id}") public ResponseEntity<Item> update( @PathVariable("id") Long id, @RequestBody Item updatedItem) { Optional<Item> updated = service.update(id, updatedItem); return updated .map(value -> ResponseEntity.ok().body(value)) .orElseGet(() -> { Item created = service.create(updatedItem); URI location = ServletUriComponentsBuilder.fromCurrentRequest() .path("/{id}") .buildAndExpand(created.getId()) .toUri(); return ResponseEntity.created(location).body(created); }); }问题是
Optional,所以为了良好的实践,应该在服务中使用和检查它。
另一个问题是实体的映射,它应该放在服务中,但如果 URI 位置介于两者之间,我不知道如何将它分开......关于如何重构它的任何解决方案? 考虑到可选项在服务中使用,与映射相同,但 URI 进入控制器。
【问题讨论】:
标签: java spring spring-boot rest jpa