Я занимаюсь разработкой приложения Spring WebFlux, и у меня есть веб-адаптер, который я использую для вызова внешних методов API, которые я использую.Один из apis имеет разбитый на страницы результат, используя заголовок ссылки с rel = "next".Мне нужно вызывать этот API до тех пор, пока не появится следующая ссылка, но я не уверен, как этого добиться.Ниже приведен базовый вызов, который я сейчас использую:
public Flux<ItemDto> getAllItems(){
return webClient.get() //The headers and base url for the api are defined in the constructor
.uri("/api/items?limit=200") //limit is the number of items returned with 200 being the maximum
.retrieve()
.bodyToFlux(Map.class)
.map(ItemConverter::mapValueToItemDto);//This is just a conversion method that handles mapping
}
Мне нужно иметь возможность повторить этот вызов, но добавить параметр запроса, основанный на части заголовка ссылки со следующим:"rel value.
Я видел упоминание об использовании расширения или повторения, но я не уверен, как именно их использовать.Я знаю, что использование exchange необходимо для получения clientResponse, чтобы я мог получить заголовки.
Этот вопрос, вероятно, довольно неопределенный, поэтому я могу дать любые разъяснения, если это необходимо.
Спасибо!
ОБНОВЛЕНИЕ
Я пытался делать разные вещи инашел что-то, что почти работает.
public Flux<ItemDto> getAllItems(){
return recursiveMethod("")//Start with the first page basically
.flatMap(clientResponse ->
clientResponse.bodyToFlux(Map.class)
.map(ItemConverter::mapValueToItemDto));
}
private Flux<ClientResponse> recursiveMethod(String after){
return webClient.get()
.uri("/api/items?limit=3" + after) //The test list I am using is only 9 items so I'm using 3 for good results
.exchange()
.expand(clientResponse -> {
List<String> links = clientResponse.headers().asHttpHeaders().getValuesAsList("LINK");
if(links.stream().anyMatch(link->link.contains("rel=\"next\""))){
for (String link : links){
if (link.contains("rel=\"next\"")){
return recursiveMethod("&" + link.substring(link.indexOf("after="), link.indexOf("&")));
//The header link has limit and after switched, that's why this looks a little odd
}
}
}
return Flux.empty();
});
}
Единственная проблема состоит в том, что он заканчивает тем, что повторял последнюю «страницу», например: Элемент 1, Элемент 2, Элемент 3, Элемент 4, Элемент 5, Элемент 6,Item 7, Item 8, Item 9, Item 7, Item 8, Item 9. Не уверен, что это из-за рекурсии, которую я настроил, или из-за Flux, или потому, что я возможно неправильно использую метод расширения.