首先流式輸出的響應(yīng)格式是:content-type: text/event-stream;charset=UTF-8
,返回的內(nèi)容自然是流式響應(yīng)翠肘。
這里為了模擬打字機效果幅慌,我設(shè)置了睡眠時間來進(jìn)行模擬
方式一:StreamingResponseBody
@GetMapping("/stream")
public StreamingResponseBody stream(HttpServletResponse response) {
// ";charset=UTF-8" 必須拼接骗随,不然中文會亂碼
response.setContentType(MediaType.TEXT_EVENT_STREAM_VALUE+";charset=UTF-8");
return outputStream -> {
// 將數(shù)據(jù)寫入輸出流
for (String s : "Hello, World!".split("")) {
try {
outputStream.write(s.getBytes());
outputStream.flush();
TimeUnit.MILLISECONDS.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
}
方式二:ResponseEntity<StreamingResponseBody>
@RequestMapping(value = "/stream")
public ResponseEntity<StreamingResponseBody> stream() {
String msg = " 什么是愛而不得? \n" +
"東邊日出西邊雨芦倒,道是無晴卻有晴艺挪。\n" +
"他朝若是同淋雪,此生也算共白頭兵扬。\n" +
"我本將心向明月麻裳,奈何明月照溝渠。\n" +
"此時相望不相聞器钟,愿逐月華流照君津坑。\n" +
"衣帶漸寬終不悔,為伊消得人憔悴傲霸。\n" +
"此情可待成追憶疆瑰,只是當(dāng)時已惘然。\n" +
"人生若只如初見狞谱,何事西風(fēng)悲畫扇乃摹。\n" +
"曾經(jīng)滄海難為水,除卻巫山不是云跟衅。\n" +
"何當(dāng)共剪西窗燭,卻話巴山夜雨時播歼。\n" +
"天長地久有時盡伶跷,此恨綿綿無絕期。\n" +
"\n";
return ResponseEntity.ok().header("content-type",MediaType.TEXT_EVENT_STREAM_VALUE+";charset=UTF-8").body(outputStream -> {
// 使用outputStream寫入數(shù)據(jù)
for (String word : msg.replaceAll("","").split("")) {
try {
outputStream.write(word.getBytes());
outputStream.flush();
TimeUnit.MILLISECONDS.sleep(100);
} catch (Exception e) {
// 處理異常
e.printStackTrace();
}
}
});
}
方式三:HttpServletResponse
@GetMapping("/stream")
public void stream(HttpServletResponse res) throws Exception{
//log.info("【prompt內(nèi)容】:{}", prompt);
String str = " 什么是愛而不得? \n" +
"東邊日出西邊雨秘狞,道是無晴卻有晴叭莫。\n" +
"他朝若是同淋雪,此生也算共白頭烁试。\n" +
"我本將心向明月雇初,奈何明月照溝渠。\n" +
"此時相望不相聞减响,愿逐月華流照君靖诗。\n" +
"衣帶漸寬終不悔郭怪,為伊消得人憔悴。\n" +
"此情可待成追憶刊橘,只是當(dāng)時已惘然鄙才。\n" +
"人生若只如初見,何事西風(fēng)悲畫扇促绵。\n" +
"曾經(jīng)滄海難為水攒庵,除卻巫山不是云。\n" +
"何當(dāng)共剪西窗燭败晴,卻話巴山夜雨時浓冒。\n" +
"天長地久有時盡,此恨綿綿無絕期尖坤。\n" +
"\n";
// 響應(yīng)流
res.setHeader("Content-Type", "text/event-stream");
res.setContentType("text/event-stream");
res.setCharacterEncoding("UTF-8");
res.setHeader("Pragma", "no-cache");
ServletOutputStream out = null;
try {
out = res.getOutputStream();
for (int i = 0; i < str.length(); i++) {
out.write(String.valueOf(str.charAt(i)).getBytes());
// 更新數(shù)據(jù)流
out.flush();
Thread.sleep(100);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (out != null) out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
然后前端的話稳懒,也需要sse
來保持連接用于服務(wù)端推送內(nèi)容。