HATEOAS 链接到带有可选请求参数的方法

问题描述 投票:0回答:3

我想链接到具有以下签名的方法:

public SomeResponse getSomeObjects(@RequestParam(value = "foo", defaultValue = "bar") Foo fooValue)

现在我希望链接看起来像这样:

http://myhost/api/someobjects

我尝试使用 Spring HATEOAS 的

methodOn
中的
ControllerLinkBuilder
,如下所示:

discoverResponse.add(linkTo(methodOn(SomeController.class).getSomeObjects(null)).withRel("someobjects"))

但它不会导致所需的链接,因为在其末尾添加了

?foo
。如何才能达到上述目标?

rest hateoas spring-hateoas
3个回答
2
投票

由于向后兼容性对您来说是一个问题,因此您始终可以像这样手动构造 Link 对象:

discoverResponse.add(new Link(baseUri() + "/someobjects", "someobjects"));

另一种选择是在 GitHub 上分叉 Spring HATEOAS,自己构建项目,并更改

ControllerLinkBuilder
中处理默认值的方式。我真的不知道您如何期望脱离上下文的链接构建器能够区分是否应该通告可选参数。在 HATEOAS 世界中,如果不包含该参数,客户端就不会知道它。那么为什么还要有可选参数呢?


1
投票

我知道已经过去了 7 年,但今天我遇到了类似的问题,导致我来到这里。在 spring hatoas 1.1.0 中,行为略有不同,相反,它会默认为非必需的 @RequestParams 生成 URI-Templates

http://myhost/api/someobjects{?foo}

如果您不希望它们出现在您的链接中,您可以将其展开

Map<String, Object> parameters = new HashMap<>();
parameters.put("foo", null);
link = link.expand(parameters);

它将产生所需的 URL

http://myhost/api/someobjects

0
投票
discoverResponse.add(
    linkTo(methodOn(SomeController.class).getSomeObjects(null))
        .withRel("someobjects")
        .expand())

会完成这项工作。您无需提供包含

null
值的地图。

https://docs.spring.io/spring-hateoas/docs/current/api/org/springframework/hateoas/Link.html#expand(java.lang.Object...)

© www.soinside.com 2019 - 2024. All rights reserved.