У меня вопрос по API Micronaut и REST.Позвольте мне сначала объяснить мой случай и то, что я пытаюсь достичь.
Давайте представим, что есть два ресурса REST person
и address
.address
является подресурсом ресурса person
, поэтому путь URI будет следующим:
/persons/{person-id}/addresses/{address-id}
Для наших клиентов REST я хотел бы предоставить функцию, которую я вызываю «Расширенные получения» аналогично объединению таблиц в SQL.
Без «Расширенные получения» клиент должен выполнить как минимум два HTTP-вызовачитать человека и его адреса.
/persons/123
- читать человека /persons/123/addresses/
- читать все адреса этого человека
С помощью «Расширенное получение» клиент может прочитать человека и его адреса только в одном запросе.
/persons/123?expands=(addresses)
Пока вступительная часть.
Чтобы реализовать это в Micronaut, я думал о регистрации HTTP-фильтра, который
- считывает результат
PersonController
- Если
expands
параметр находится в строке запроса, он должен разрешать шаблон uri addresses
подресурса - с шаблоном uri, который должен указывать Micronaut для разрешения соответствующего метода bean-компонента контроллера.
- вызывать методи объедините человека и адреса в теле ответа
Он попытался реализовать некоторые фильтры, как вы можете видеть ниже.
Мои вопросы сейчас:
- Есть ли в Micronaut способ разрешить компонент управления и метод с помощью
UriTemplate
и HttpMethod
? - Как я могу вызвать этот метод?
Псевдо-реализация
@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 и буду рад, если кто-нибудь из вас подскажет, как я могу реализовать эту функцию.Спасибо.