【问题标题】:Spring Webclient decode custom application/multipart-related,application/dicom (Wado-RS)Spring Webclient decode custom application/multipart-related,application/dicom (Wado-RS)
【发布时间】:2020-10-30 10:29:34
【问题描述】:

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

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

我该怎么做?

【问题讨论】:

    标签: java spring-webflux dicomweb


    【解决方案1】:

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

    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())))
    

    【讨论】:

    • 比我的好!谢谢!
    【解决方案2】:

    这就是我为使其正常工作所做的工作。我直接使用 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());
    
                });
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-15
      • 2022-08-09
      • 1970-01-01
      • 2019-02-20
      • 2020-08-02
      • 1970-01-01
      相关资源
      最近更新 更多