为了账号安全,请及时绑定邮箱和手机立即绑定

使用新参数重复 WebClient 获取

使用新参数重复 WebClient 获取

慕哥6287543 2022-06-08 16:55:16
我正在开发一个 Spring WebFlux 应用程序,并且我有一个 Web 适配器,用于调用我使用的外部 api 方法。其中一个 api 使用带有 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 值的链接标头的一部分。我已经看到提到使用扩展或重复,但我不确定如何准确使用它们。我知道使用 exchange 是获取 clientResponse 所必需的,因此我可以获得标头。这个问题可能相当模糊,所以如果需要,我可以提供任何澄清。
查看完整描述

1 回答

?
ABOUTYOU

TA贡献1812条经验 获得超5个赞

经过大量试验和错误并找到特定部分的解决方案后,我找到了适合我的解决方案。


public Flux<ItemDto> getAllItems() {

    webClient.get()

            .uri("/api/items?limit=1")//Used one to test

            .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 webClient.get()

                                    .uri("/api/items?limit=1&" + link.substring(link.indexOf("after="), link.indexOf("&")))

                                    .exchange();

                        }

                    }

                }

                return Flux.empty();

            })

            .flatMap(clientResponse ->

                    clientResponse.bodyToFlux(Map.class)

                            .map(ItemConverter::mapValueToItemDto));

}

不需要任何递归。只是更合适地使用扩展。现在,其中的一部分(见下文)实际上可以分解成自己的方法,但由于它只有几行,我选择不这样做。


webClient.get()

   .uri("/api/items?limit=1" + after)//This after bit would be like what was passed as an argument before

   .exchange();


查看完整回答
反对 回复 2022-06-08
  • 1 回答
  • 0 关注
  • 132 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号