如何解决Spring HATEOAS:如何使POST / PUT / PATCH端点不言自明?
强烈认为,真正的RESTful服务必须包括超媒体。否则,只有RPC才能在没有手写文档的情况下进行交互。假设遵循此概念,我们想通过添加具有EntityModel<User>
关系的链接来调整一些"update"
:
@Bean
public RepresentationModelProcessor<EntityModel<User>> userProcessor() {
return model -> model.add(linkTo(methodon(UserController.class)
.updateUser(model.getContent().getUsername(),new User()))
.withRel("update"));
}
最简单形式的方法updateUser()
如下所示:
@PatchMapping(path = "/users/{username}/update" consumes = "application/json",produces = "application/hal+json")
@ResponseStatus(HttpStatus.OK)
public EntityModel<User> updateUser(@PathVariable String username,@RequestBody User patch) {
// #1 fetch
User user = usersRepository.findByUsername(username)
.orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND,"User not found"));
// #2: update
if (patch.getFirstName() != null)
user.setFirstName(patch.getFirstName());
if (patch.getLastName() != null)
user.setLastName(patch.getLastName());
// #3: merge
usersRepository.save(user);
return EntityModel.of(user);
}
现在,我们的User
表示形式包含以下"_links"
部分:
"_links": {
"self": {
"href": "http://localhost:8080/api/users/jeremy"
},"update": {
"href": "http://localhost:8080/api/users/jeremy/update"
}
}
自链接以及其他可能的GET链接都没有问题,甚至可以使用请求参数或路径变量作为模板。但是我们如何暗示"update"
端点期望PATCH请求(而不是GET,POST或PUT)具有模板化的请求主体,该请求主体将与User
对象的属性相匹配?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。