繁体   English   中英

如何发送 Stream<string> 作为来自 REST API 的客户的响应?</string>

[英]How to send Stream<String> as response to client from REST API?

我对服务器有一个安静的调用,我想从该服务器返回字符串为 Stream(流式传输数据)。 在当前的代码实现中,我将数据存储为 List<String> 并将包含该列表的 ResponseEntity 作为响应发送。 但是 List 包含大量数据,我们希望实现 memory 优化。 因此,作为一种解决方案,我们希望 stream 从 rest api 中逐块列出 <String> ,并对客户端的数据进行处理。 我不想将数据直接写入 StreamingResponseBody 允许的 OutputStream 。

当前 Api:

@RestController
@RequestMapping(value = "/rest/api/")
public class StringRestController {

    @RequestMapping(value = "/stream", method = RequestMethod.GET)
    public ResponseEntity<List<String>> getMessage(HttpServletRequest request, HttpServletResponse response) {
        
        List<String> mList = new ArrayList<>();
        
        List<Long> dataList = getListFromDb();

        //Here do something with dataList and store List<String> in mList

        if (CollectionUtils.isEmpty(mList)) {
            return ResponseEntity.notFound().build();
        } else {
            return new ResponseEntity<>(mList, HttpStatus.OK);
        }

    }
}

我希望数据被流式传输,因为 List<String> 很大。 一次性发送存在性能问题,并且从 memory 优化的角度来看,它可能会导致问题。 我们同样使用 Java 1.8 和 Spring 3.0。

我建议你自己实现分块。

您描述的分块仅涉及将数据传输到客户端。 您已经提到“从 memory 优化的角度来看它可能会导致问题”。 这里的大问题是你从数据库中加载整个列表。 这也需要分块。

因此,实现默认情况下仅从数据库加载一定数量的元素(如 100 个)。 在响应中告诉客户“这里有 100 个,但还有更多”。 然后客户需要发送附加请求,其中包含“我已经有 100 个,再给我 100 个”的信息。

因此,正如您所看到的,使用简单的注释或其他东西无法做到这一点,它需要您更改 api 字段。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM