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 (将#修改为@)