Spring WebFlux:使用 headers 为 Mixed-Replace HTTP 响应流式传输原始 HTTP 响应字符串
Spring WebFlux: Stream raw HTTP response string with headers for Mixed-Replace HTTP Response
使用 Spring WebFlux 我想 return Mixed-Replace 看起来像这样的 HTTP 响应:
HTTP/1.1 200 Ok
Content-Type: multipart/x-mixed-replace; boundary=--icecream
--icecream
Content-Type: image/jpeg
Content-Length: [length]
[data]
--icecream
Content-Type: image/jpeg
Content-Length: [length]
[data]
数据从 Flux 流式传输(想想 Flux.interval(1000).map(fetchImageFrame)
),但我找不到如何流式传输原始 HTTP 响应数据的方法,大多数示例都让我可以访问 HTTP body只有,但不是我可以控制 HTTP 的整个响应 headers.
您是否尝试过将 Flux
响应包装在 ResponseEntity
中并在 ResponseEntity
上设置所需的 headers?
类似于:
@GetMapping(value = "/stream")
ResponseEntity<Flux<byte[]>> streamObjects() {
Flux<byte[]> flux = Flux.fromStream(fetchImageFrame()).delayElements(Duration.ofSeconds(5));
HttpHeaders headers = HttpHeaders.writableHttpHeaders(HttpHeaders.EMPTY);
headers.add("Content-Type", "multipart/x-mixed-replace; boundary=--icecream");
return new ResponseEntity<>(flux, headers, HttpStatus.OK);
}
private Stream<byte[]> fetchImageFrame() {
return List.of(
load("image1.jpg"),
load("image2.jpg"),
load("image3.jpg"),
load("image4.jpg")
).stream();
}
private byte[] load(String name) {
try {
byte[] raw = Files.readAllBytes(Paths.get(name));
ByteArrayOutputStream bos = new ByteArrayOutputStream();
String headers =
"--icecream\r\n" +
"Content-Type: image/jpeg\r\n" +
"Content-Length: " + raw.length + "\r\n\r\n";
bos.write(headers.getBytes());
bos.write(raw);
return bos.toByteArray();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
使用 Spring WebFlux 我想 return Mixed-Replace 看起来像这样的 HTTP 响应:
HTTP/1.1 200 Ok
Content-Type: multipart/x-mixed-replace; boundary=--icecream
--icecream
Content-Type: image/jpeg
Content-Length: [length]
[data]
--icecream
Content-Type: image/jpeg
Content-Length: [length]
[data]
数据从 Flux 流式传输(想想 Flux.interval(1000).map(fetchImageFrame)
),但我找不到如何流式传输原始 HTTP 响应数据的方法,大多数示例都让我可以访问 HTTP body只有,但不是我可以控制 HTTP 的整个响应 headers.
您是否尝试过将 Flux
响应包装在 ResponseEntity
中并在 ResponseEntity
上设置所需的 headers?
类似于:
@GetMapping(value = "/stream")
ResponseEntity<Flux<byte[]>> streamObjects() {
Flux<byte[]> flux = Flux.fromStream(fetchImageFrame()).delayElements(Duration.ofSeconds(5));
HttpHeaders headers = HttpHeaders.writableHttpHeaders(HttpHeaders.EMPTY);
headers.add("Content-Type", "multipart/x-mixed-replace; boundary=--icecream");
return new ResponseEntity<>(flux, headers, HttpStatus.OK);
}
private Stream<byte[]> fetchImageFrame() {
return List.of(
load("image1.jpg"),
load("image2.jpg"),
load("image3.jpg"),
load("image4.jpg")
).stream();
}
private byte[] load(String name) {
try {
byte[] raw = Files.readAllBytes(Paths.get(name));
ByteArrayOutputStream bos = new ByteArrayOutputStream();
String headers =
"--icecream\r\n" +
"Content-Type: image/jpeg\r\n" +
"Content-Length: " + raw.length + "\r\n\r\n";
bos.write(headers.getBytes());
bos.write(raw);
return bos.toByteArray();
} catch (IOException e) {
throw new RuntimeException(e);
}
}