我对Micronaut和REST API有疑问。首先让我解释一下我的情况以及我要实现的目标。
我们假设有两个REST资源person
和address
。 address
是person
资源的子资源,因此URI路径如下。
/persons/{person-id}/addresses/{address-id}
对于我们的REST客户端,我想提供一个我称为“ Expanded Gets” 的功能,类似于SQL中的表联接。
没有 “扩展获取” ,客户端必须执行至少两个HTTP调用才能读取一个人及其地址。
/persons/123
-阅读该人/persons/123/addresses/
-读取该人的所有地址通过 “扩展获取” ,客户只能在一个请求中读取此人及其地址。
/persons/123?expands=(addresses)
到目前为止,简介部分。
为了在Micronaut中实现此目的,我正在考虑注册一个执行此操作的HTTP过滤器
PersonController
expands
参数在查询字符串中,则它应解析addresses
子资源的uri模板它试图实现一些过滤器,如下所示。
我的问题是:
UriTemplate
和HttpMethod
来解析控制器bean和方法?伪实现
@Filter("/v1/**")
public class HateoasFilter implements HttpServerFilter {
@Override
public Publisher<MutableHttpResponse<?>> doFilter(
HttpRequest<?> request, ServerFilterChain chain) {
return Flowable.fromPublisher(chain.proceed(request)).doOnNext((res) -> {
// if the request contains a expands parameter in the querystring
if (!request.getParameters().getAll("expands").isEmpty()) {
// get the person
Person person = res.body();
String expands = request.getParameters().getFirst("expands").get();
// lookup the uri path. address => /person/{personId}/addresses/. This is part of the application and not Micronaut.
String uriPathForSubresource = subresourceRegistry.lookup("addresses");
UriTemplate subresourceUriTemplate = UriTemplate.of(uriPathForSubresource);
// how can I lookup the controller bean and GET method for a uri template?
Method m = micronaut.lookupMethod(subresourceUriTemplate, HttpMethod.GET);
// invoke the controller method and the the addresses
List<Address> addresses = m.invoke(....);
// put em to the body
res.body(new PersonAddresses(person, addresses))
}
});
}
}
我是Micronaut的新手,如果任何人都可以向我提示如何实现该功能,我将感到非常高兴。谢谢。