Сквозной API / Сохранение заголовков бэкэнда в Spring Webflux - PullRequest
0 голосов
/ 06 февраля 2020

Я создаю приложение для вызова серверной части, которая отвечает MIME-типом.

@Override
public Mono<String> getDocument() {
    return webClient.get()
            .uri(path)
            .retrieve()
            .bodyToMono(String.class);
}

Из этого запроса мне нужно сохранить заголовки ответа и передать его как ответ. Это происходит главным образом потому, что заголовки ответа содержат тип содержимого файла Dynami c. Мне нужно перенаправить эти заголовки (все полученные) в ответ API. Например:

Content-Type : application/pdf
Content-Disposition: attachment; filename="test.pdf"

Ниже приведен мой обработчик.

public Mono<ServerResponse> getDocument(ServerRequest request) {
        return ServerResponse
                .ok()
                .contentType(MediaType.APPLICATION_PDF)
                .header("Content-Disposition", "attachment; filename=\"test.pdf\"")
                .body(BodyInserters.fromPublisher(documentService.getDocument(), String.class));
    }

Файл поступает из API как приложение, как и ожидалось, но я не хочу жестко кодировать содержимое заголовок Как мне этого добиться?

Обновление с кодом обработчика:

public Mono<ServerResponse> getDocument(ServerRequest request) {
     return ServerResponse
            .ok()
            .contentType(MediaType.APPLICATION_JSON)
            .body(BodyInserters.fromPublisher(documentService.getDocument(), String.class));
}

1 Ответ

0 голосов
/ 06 февраля 2020

Мне удалось решить проблему, возвращая ResponseEntity из службы вместо тела и используя его для создания ServerResponse в обработчике.

Служба:

public Mono<ResponseEntity<String>> getDocument() {
    return webClient.get()
            .uri(path)
            .retrieve()
            .toEntity(String.class);
}

Обработчик :

   public Mono<ServerResponse> getDocument(ServerRequest request) {
        return documentService
                .getDocument()
                .flatMap(r -> ServerResponse
                        .ok()
                        .headers(httpHeaders -> httpHeaders.addAll(r.getHeaders()))
                        .body(BodyInserters.fromValue(r.getBody()))
                );
    }
...