问题描述
强烈认为,真正的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 (将#修改为@)