当前位置: 首页 > 知识库问答 >
问题:

带有文本/HTML响应的反应式WebClient获取请求

端木野
2023-03-14

目前我有一个问题与新的Spring5WebClient,我需要一些帮助来解决它。问题是:

我请求一些url返回内容类型为text/html;charset=utf-8的json响应。

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

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

顺便说一句,我在accept头中指向哪种类型并不重要,总是返回text/html。那么如何最终转换我的响应呢?

共有1个答案

雍嘉勋
2023-03-14

让服务发送带有“text/html”内容类型的JSON是相当不寻常的。

对此有两种处理方法:

  1. 将Jackson解码器配置为也对“text/html”内容进行解码;查看webclient.builder().ExchangeStrategies(ExchangeStrategies)安装方法
  2. 动态更改“内容类型”响应头
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;
  }
}

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

 类似资料:
  • 问题内容: 目前,我在使用新的Spring 5 WebClient时遇到问题,需要一些帮助来解决它。问题是: 我请求一些返回json响应的URL,其内容类型为 text / html; charset = utf-8 。 但不幸的是,我仍然遇到异常: org.springframework.web.reactive.function.UnsupportedMediaTypeException:不支

  • 我有一个关于Spring Reactive WebClient的问题...几天前,我决定在Spring Framework中玩新的反应式东西,我做了一个仅用于个人目的的抓取数据的小项目。(向一个网页发出多个请求并组合结果)。 我开始使用新的反应式WebClient发出请求,但我发现的问题是客户端没有对每个请求发出响应。听起来很奇怪。下面是我为获取数据所做的工作: 以及调用fetchData的函数:

  • 问题内容: 我试图一起使用以发出POST请求。到目前为止,我的代码: 它工作正常,但是,当发生HTTP错误时,会发出警告: 并返回false。有没有办法: 禁止显示警告(如果发生故障,我打算抛出自己的异常) 从流中获取错误信息(至少是响应代码) 问题答案: http://php.net/manual/en/reserved.variables.httpresponseheader.php

  • 我正在研究访问HTTP请求和响应体的最佳方式,以便在Spring反应式应用程序中进行跟踪。 对于以前的版本,我们已经利用Servlet过滤器和Servlet请求包装器来使用传入请求的输入流,并保存其副本,以便异步处理跟踪(我们将其发送给Elasticsearch)。 但对于一个Spring反应式应用程序(使用webflux),我想知道在解码之前访问请求的最合适方式是什么。有什么想法吗?

  • 我一直在努力学习关于如何使用的最简单的教程,我认为这是与相比的下一个最棒的教程。 例如,https://www.baeldung.com/spring-5-webclient#4-geting-a-response 因此,当我尝试对https://petstore.swagger.io/v2/pet/findbystatus?status=available执行同样的操作时,

  • 我正在尝试为Vertx web客户端编写一个包装器,以便使用reactivestreams中的Publisher从服务器加载响应正文: 此解决方案是不正确的,因为它通过调用以阻塞方式读取所有正文字节。 是否可以分块读取来自Vertx网络客户端的响应,并将其转换为发布者(或Rx可流动的)?