4

使用很棒的 HATEOAS 链接功能,我正在尝试输出模板化的 url 以突出显示用户可用的过滤器参数

示例控制器方法

@RequestMapping(value = "/persons", method = RequestMethod.GET, produces = "application/hal+json")
public PersonsResource getPersons (@RequestParam(required = false, value = "name") String name, @RequestParam(required = false, value = "age") Integer age) {
...
    personsResource.add(ControllerLinkBuilder.linkTo(ControllerLinkBuilder.methodOn(PersonController.class).getPersons(name, age)).withSelfRel());
}

当不带参数调用此方法时,会出现链接

_links: {
    self: {
        href: "http://myserver:8080/persons"
    }
}

但我愿意

href: "http://myserver:8080/persons?name={name}&age={age}

如果提供一个参数就更好了

href: "http://myserver:8080/persons?name={name}&age=21

锦上添花是要忽略 {...] 的查询参数吗?

有谁知道这是否可以使用 Spring HATEOAS api ?我已经设法解决了这个问题,但这似乎是对 API 的合理建议?

4

3 回答 3

4

您可以尝试使用 spring- hateoas -ext 中的 AffordanceBuilder 作为 ControllerLinkBuilder 的替代品。它为您在 linkTo-methodOn 习语中未定义的参数创建模板变量。

它不仅允许创建模板,还为您提供 RFC 5988 链接的全部功能,并了解请求主体,因此可以使用表单样式的请求描述符呈现 Hydra 或 Html 或 Siren 响应。

免责声明:我是 spring-hateoas-ext 的作者。

于 2015-12-03T06:01:14.107 回答
0

我想,这个框架还很不成熟。

我有 v.0.11.0.RELEASE 并且有同样的问题。

当您不提供参数值时,由于 ControllerLinkBuilder.linkTo(methodOn) 调用,您没有模板 URL。就像你说的那样,方法注释的基本路径。

但是当您提供参数值时,就像您说的那样:( https://stackoverflow.com/some/service/path?name=SomeName&age=11 在我的情况下,参数是不同的,但效果是您在此处看到的)

“概念上正确”的 URL 应该是

https://stackoverflow.com/some/service/path{?name,age}

但是 Spring HATEOAS 不支持这一点。除非您想自己在代码中附加它。这真的是不可取的。

我从 JavaEE 检查了 UriBuilder,它的工作方式相同,不支持查询参数的模板。

于 2014-06-09T18:35:38.757 回答
0

这已在最新的 spring-hateoas 版本中得到解决。您可以检查以下问题:
https ://github.com/spring-projects/spring-hateoas/issues/169

您应该能够使用以下内容获取所需的模板化 URL:

resource.add(linkTo(methodOn(Controller.class).method(null)).withSelfRel());
于 2017-03-02T18:32:03.533 回答