当前位置: 首页 > 知识库问答 >
问题:

Spring Flux来自使用Link响应头的分页调用

蔚丰
2023-03-14

对于反应式编程和SpringWebClient来说,这是一个相当新的概念,所以我正在尝试了解它,本质上,我有一个分页的结果列表,可以从一个REST服务中使用,该服务使用一个链接响应头进行响应,该响应头带有一个与下一页结果(如果存在)相关的URI。我想把所有的页面都收集到一个通量中。默认情况下,生成的ApicClient具有如下内容

public <T> Flux<T> invokeFluxAPI(String path, HttpMethod method, Map<String, Object> pathParams,
        MultiValueMap<String, String> queryParams, Object body, HttpHeaders headerParams,
        MultiValueMap<String, String> cookieParams, MultiValueMap<String, Object> formParams,
        List<MediaType> accept, MediaType contentType, String[] authNames, ParameterizedTypeReference<T> returnType)
        throws RestClientException {
    final WebClient.RequestBodySpec requestBuilder = prepareRequest(path, method, pathParams, queryParams, body,
            headerParams, cookieParams, formParams, accept, contentType, authNames);
    return requestBuilder.retrieve().bodyToFlux(returnType);
}

那么,我是否需要对结果的每一页进行某种递归调用,将每一页合并成一个流量?沿着……的路线

public <T> Flux<T> invokeFluxAPI(String path, HttpMethod method, Map<String, Object> pathParams,
        MultiValueMap<String, String> queryParams, Object body, HttpHeaders headerParams,
        MultiValueMap<String, String> cookieParams, MultiValueMap<String, Object> formParams,
        List<MediaType> accept, MediaType contentType, String[] authNames, ParameterizedTypeReference<T> returnType)
        throws RestClientException {
    final WebClient.RequestBodySpec requestBuilder = prepareRequest(path, method, pathParams, queryParams, body,
            headerParams, cookieParams, formParams, accept, contentType, authNames);
    return requestBuilder.exchange()
            .doOnSuccess(response -> {
                List<String> links = response.headers().header("Link");
                if (!links.isEmpty()) {
                    String nextPageUri = links.get(0);
                    // Get next page using the URI
                }
            })
            .flatMapMany(response -> response.bodyToFlux(returnType));
}

共有1个答案

端木高邈
2023-03-14

所以我设法让这个工作通过处理客户端响应作为一个结果页eg.

public <T> Flux<T> invokeFluxAPI(String path, HttpMethod method, Map<String, Object> pathParams,
        MultiValueMap<String, String> queryParams, Object body, HttpHeaders headerParams,
        MultiValueMap<String, String> cookieParams, MultiValueMap<String, Object> formParams,
        List<MediaType> accept, MediaType contentType, String[] authNames, ParameterizedTypeReference<T> returnType)
        throws RestClientException {
    return fetchResultsPage(path, method, pathParams, queryParams, body, headerParams, cookieParams, formParams, accept, contentType, authNames).expand(response -> {
        List<String> links = response.headers().header("Link");
        if (links.isEmpty()) {
            return Mono.empty();
        }

        Matcher m = "(?<=\\<)([^\\]]+)(?=\\>)".matcher(links.get(0));

        if (!m.find())) {
            return Mono.empty();
        }

        String nextPageUri = m.group(1);

        MultiValueMap<String, String> qParams = UriComponentsBuilder.fromUriString(nextPageUri).build().getQueryParams();

        queryParams.putAll(qParams);
        queryParams.replace("limit", qParams.get("limit"));

        return fetchResultsPage(path, method, pathParams, queryParams, body, headerParams, cookieParams, formParams, accept, contentType, authNames);
    }).flatMap(response -> response.bodyToFlux(returnType);
}

private Mono<ClientResponse> fetchResultsPage(String path, HttpMethod method, Map<String, Object> pathParams,
        MultiValueMap<String, String> queryParams, Object body, HttpHeaders headerParams,
        MultiValueMap<String, String> cookieParams, MultiValueMap<String, Object> formParams,
        List<MediaType> accept, MediaType contentType, String[] authNames) {
    final WebClient.RequestBodySpec requestBuilder = prepareRequest(path, method, pathParams, queryParams, body,
            headerParams, cookieParams, formParams, accept, contentType, authNames);
    return requestBuilder.exchange();
}
 类似资料:
  • 我想在RESTful API中支持分页。 我的API方法应该通过返回产品的JSON列表。但是,可能有成千上万的产品,我想浏览它们,所以我的请求应该如下所示: 但我的JSON响应需要是什么样的呢?API使用者通常会在响应中期望分页元数据吗?还是只需要一系列产品?为什么? 看起来Twitter的API包含元数据:https://dev.twitter.com/docs/api/1/get/lists/

  • 问题内容: 我的网络服务返回一个JSON对象,如下所示 即,当我将此地址放入chrome浏览器中时,我可以到达上面。 我正在尝试在浏览器中阅读此内容,以便可以创建一个下拉选项…但是从以下代码开始我一无所获: 我总是在警报框中。我用fiddler2再次检查了Web服务请求/响应是否正常,我什至可以拦截Web服务和浏览器之间的json对象。 我也试过 我又得到了空。 我已经看过Ajax要求的json响

  • 我尝试通过Java执行一个SOAP请求并获得SOAP响应,然后从JSP页面调用它。我研究了许多网站,尝试了许多方法,但似乎无法让它工作。 我使用一些wsdl来测试http://www.webservicex.net/australianpostcode.asmx?wsdl 我一直收到这个错误 java.io.ioException:服务器返回HTTP响应代码:500的URL:HTTP://www.

  • 问题内容: 是否可以在PHP中处理来自AJAX请求的响应?我不是一个真正的JS开发人员,所以我正在用这个开发人员。 我有点黑了: }); 该功能似乎可以正常运行,它会向我发出有关正确数据的警报。 我需要能够将此输出给用户,以便可读。我发现很多指南都描述了替换数据,但就目前而言,直到选择child_id之前,没有数据。.然后我希望它以可读的方式显示上述数据。 我不知道如何开始使用视图文件(php)中

  • 我正在用Spring Boot编写一个后端应用程序,它从第三方调用另一个应用程序接口。 我对这个特定的调用有一个问题,它检索一个包含承载令牌的令牌对象,然后我在它们的其他endpoint中使用它。当调用其他终结点时,检索到的令牌有时工作,但大多数情况下不工作,从而导致未经授权的响应。 下面是一个示例令牌对象: 使用postman检索令牌工作得非常好,因此第三方API不会有问题。我在中也实现了相同的

  • 在我的项目中,我创建了一个py函数,用于检查和修改我的谷歌日历,如下所示: 当我在lambda上测试它时,一切都完成了,但是当我从lambda创建API时: 并对其进行测试,结果是: 2017年12月20日星期三13:35:58 UTC:由于配置错误,执行失败:Lambda代理响应格式错误2017年12月20日星期三13:35:58 UTC:方法已完成,状态为:502 提前谢谢