使用 Spring Boot 2 WebClient 从响应中获取标头

Posted

技术标签:

【中文标题】使用 Spring Boot 2 WebClient 从响应中获取标头【英文标题】:Get headers from response with Spring Boot 2 WebClient 【发布时间】:2021-11-15 20:31:55 【问题描述】:

我想从 webclient 响应中接收标头(尤其是内容类型)。 我用 flatmap-mono-getHeaders 找到了这段代码,但它不起作用。

org.springframework.web.reactive.function.UnsupportedMediaTypeException: Content type 'image/tiff' not supported for bodyType=org.company.MyResponse

我该如何解决?或者也许有人可以推荐一个更简单的解决方案。

Mono<Object> mono = webClient.get()
                                .uri(path)
                                .acceptCharset(StandardCharsets.UTF_8)
                                .retrieve()
                                .toEntity(MyResponse.class)
                                .flatMap(entity -> Mono.justOrEmpty(entity.getHeaders().getFirst("content-type")));
Object rs = mono.block();
public class MyResponse 
 Object body;
 Integer status;
 String contentType;

【问题讨论】:

【参考方案1】:

我想从 webclient 响应中接收标头(尤其是内容类型)

一般来说,您可以像这样访问响应标头:

ResponseEntity<MyResponse> response = webClient.get()
        .uri(path)
        .acceptCharset(StandardCharsets.UTF_8)
        .retrieve()
        .toEntity(MyResponse.class)
        .block();
HttpHeaders headers = response.getHeaders();
MediaType contentType = headers.getContentType();

但是从您粘贴的错误看来,您正在访问的图像 (image/tiff) 显然无法转换为您的 MyResponse 类。

【讨论】:

是的,响应是图像。如果没有必要,我不想将响应转换为类。这是我发现的唯一有用的例子,这就是我尝试它的原因。我只想要标题内容类型。那么如果响应是图像,就没有办法获取标题吗?如果我使用 .get().uri().retrieve() 和一些 onStatus() ,我会得到没有 .getHeaders() 的 ResponseSpec。 如果您只对响应标头感兴趣,您可以执行HEAD 请求而不是GET。您也可以使用.toBodilessEntity() 代替.toEntity(MyResponse.class) 谢谢!它几乎可以工作。我尝试使用 .toEntity( String.class ) ,我也收到了标题和图像。但是当我写入文件时,字符串,字符与真实 tif 图像中的字符不同,我无法打开文件。我也尝试使用 .toEntity( MultipartFile ),但它再次“不支持”。也许我可以将它称为 Multipart 以外的其他名称?还是字符编码错误? 看来,标准字符很好(a、b、c...),但“原始 tiff”图像有 'm=p`¶ŕ¸żĂh ' 和 'w˙ü/ ˙Č' 字符,我在回复中没有。我只是有矩形....我将 UTF_8 更改为 UTF_16BE 和 ISO_8859_1 ,但结果是一样的。 试试.toEntity(byte[].class)

以上是关于使用 Spring Boot 2 WebClient 从响应中获取标头的主要内容,如果未能解决你的问题,请参考以下文章

spring boot 2.0之使用spring boot

Spring boot- Spring Boot特性2

(转)Spring Boot 2 :使用 Docker 部署 Spring Boot

Spring Boot 2.0:使用 Docker 部署 Spring Boot

Spring Boot 2.0:使用 Docker 部署 Spring Boot

使用 Docker 构建部署运行Spring Boot应用 《Spring Boot 2.0 极简教程》