![](/img/trans.png)
[英]Streaming Rest Api - Send data in chunks to the client in a stream from the restful api
[英]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.