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()))
);
}
我正在构建一个应用程序来调用 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()))
);
}