簡體   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