0

我正在尝试解码一个与多部分相关的请求,该请求只是一个简单的多文件下载,但按部分具有特定的内容类型(应用程序/dicom 而不是应用程序/八位字节流)。由于响应主体的结构可能相同,我可以告诉“多部分编解码器”将该内容类型视为八位字节流。

public Flux<FilePart> getDicoms(String seriesUri) {
    return webClient.get()
            .uri(seriesUri)
            .accept(MediaType.ALL)
            .retrieve()
            .bodyToFlux(FilePart.class);
}

我怎样才能做到这一点?

4

2 回答 2

2

阅读多部分响应的更简单方法:

private Mono<ResponseEntity<Flux<Part>>> queryForFiles(String uri)
    final var partReader = new DefaultPartHttpMessageReader();
    partReader.setStreaming(true);
    
    return WebClient.builder()
            .build()
            .get()
            .uri(wadoUri)
            .accept(MediaType.ALL)
            .retrieve()
            .toEntityFlux((inputMessage, context) -> partReader.read(ResolvableType.forType(DataBuffer.class), inputMessage, Map.of())))
于 2021-09-09T11:04:26.080 回答
0

这就是我为使其工作所做的工作。我直接使用 DefaultPartHttpMessageReader 类来干净地完成它(spring 5.3)。

public Flux<Part> getDicoms(String wadoUri) {
    final var partReader = new DefaultPartHttpMessageReader();
    partReader.setStreaming(true);
    return WebClient.builder()
            .build()
            .get()
            .uri(wadoUri)
            .accept(MediaType.ALL)
            //.attributes(clientRegistrationId("keycloak"))
            .exchange()
            .flatMapMany(clientResponse -> {
                var message = new ReactiveHttpInputMessage() {
                    @Override
                    public Flux<DataBuffer> getBody() {
                        return clientResponse.bodyToFlux(DataBuffer.class);
                    }

                    @Override
                    public HttpHeaders getHeaders() {
                        return clientResponse.headers().asHttpHeaders();
                    }
                };
                return partReader.read(ResolvableType.forType(DataBuffer.class), message, Map.of());

            });
}
于 2020-11-02T08:14:09.680 回答