Pass-through API / 在 Spring Webflux 中保留后端 headers

Pass-through API / Preserve backend headers in Spring Webflux

我正在构建一个应用程序来调用 back-end,它以 mime-type 响应进行响应。

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

根据这个请求,我需要保留响应 headers 并将其作为响应传递。这主要是因为响应 header 包含文件的动态内容类型。我需要将这些 header(全部收到)转发给 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 传来,但我不想对 content-type header 进行硬编码。我怎样才能做到这一点?

更新处理程序代码:

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

我能够通过从服务而不是正文返回 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()))
                );
    }