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

3
我希望能够从Web客户端响应中获取标题(特别是内容类型)。我找到了使用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个回答

7
我希望从web客户端响应中获取头文件(特别是content-type)。 通常情况下,您可以通过以下方式访问响应头:
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 - user2287094
2
如果你只对响应头感兴趣,你可以执行一个 HEAD 请求而不是 GET。此外,你可以使用 .toBodilessEntity() 代替 .toEntity(MyResponse.class) - slauth
谢谢!它几乎可以工作了。我尝试使用.toEntity(String.class),我收到了头文件和图像。但是当我将字符串写入文件时,字符与真实的tif图像不同,我无法打开该文件。我还尝试使用.toEntity(MultipartFile),但它仍然“不支持”。也许我可以用其他名称来调用它?或者错误在字符编码中? - user2287094
似乎标准字符(a,b,c...)很好,但“原始tiff”图像具有'm=p`¶ŕ¸żĂh'和'w˙ü/˙Č'字符,而我在响应中没有这些字符。我只有矩形... 我将UTF_8更改为UTF_16BE和ISO_8859_1,但结果相同。 - user2287094
尝试使用.toEntity(byte[].class) - slauth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接