Spring Webclient декодирует пользовательское приложение / связанное с несколькими частями, приложение /dicom (Wado-RS)
Я пытаюсь декодировать запрос, связанный с несколькими частями, который представляет собой простую загрузку нескольких файлов, но с определенным типом содержимого по частям (application/dicom, а не application/octet-stream). Поскольку структура тела ответа может быть идентичной, я мог бы просто сказать "многостраничному кодеку" обрабатывать этот тип контента как поток октетов.
public Flux<FilePart> getDicoms(String seriesUri) {
return webClient.get()
.uri(seriesUri)
.accept(MediaType.ALL)
.retrieve()
.bodyToFlux(FilePart.class);
}
Как я могу это сделать? Спасибо большое!
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())))
Вот что я сделал, чтобы это работало. Я использовал непосредственно класс DefaultPartHttpMessageReader, чтобы сделать это чисто (весна 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());
});
}