首页 文章

具有text / html响应的Reactive WebClient GET请求

提问于
浏览
2

目前我遇到了新的Spring 5 WebClient的问题,我需要一些帮助来解决它 . 问题是:

我请求一些返回内容类型为text / html; charset = utf-8的json响应的url . 但不幸的是,我仍然得到一个例外:org.springframework.web.reactive.function.UnsupportedMediaTypeException:不支持内容类型'text / html; charset = utf-8' . 所以我无法将响应转换为DTO .

对于请求,我使用以下代码:

Flux<SomeDTO> response = WebClient.create("https://someUrl")
                .get()
                .uri("/someUri").accept(MediaType.APPLICATION_JSON)
                .retrieve()
                .bodyToFlux(SomeDTO.class);

response.subscribe(System.out::println);

顺便说一句,我接受 Headers 的哪种类型无关紧要,总是返回text / html . 那我怎么能最终转换我的回复呢?

1 回答

  • 0

    让服务发送带有 "text/html" Content-Type的JSON是相当不寻常的 .

    有两种方法可以解决这个问题:

    • 配置Jackson解码器也解码 "text/html" 内容;查看 WebClient.builder().exchangeStrategies(ExchangeStrategies) 设置方法

    • 动态更改"Content-Type"响应标头

    这是第二个解决方案的提案:

    WebClient client = WebClient.builder().filter((request, next) -> next.exchange(request)
                    .map(response -> {
                        MyClientHttpResponseDecorator decorated = new 
                            MyClientHttpResponseDecorator(response); 
                        return decorated;
                    })).build();
    
    class MyClientHttpResponseDecorator extends ClientHttpResponseDecorator {
    
      private final HttpHeaders httpHeaders;
    
      public MyClientHttpResponseDecorator(ClientHttpResponse delegate) {
        super(delegate);
        this.httpHeaders = new HttpHeaders(this.getDelegate().getHeaders());
        // mutate the content-type header when necessary
      }
    
      @Override
      public HttpHeaders getHeaders() {
        return this.httpHeaders;
      }
    }
    

    请注意,您应该只在该上下文中使用该客户端(对于此主机) . 我强烈建议尝试修复服务器返回的奇怪内容类型,如果可以的话 .

相关问题