当前位置: 首页 > 面试题库 >

带有文本/ html响应的反应式WebClient GET请求

苏建安
2023-03-14
问题内容

目前,我在使用新的Spring 5 WebClient时遇到问题,需要一些帮助来解决它。问题是:

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

但不幸的是,我仍然遇到异常:
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);

顺便说一句,我指向接受标头的类型实际上并不重要,总是返回text / html。那么我如何才能最终转换我的回答?


问题答案:

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

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

  1. 配置Jackson解码器也可以解码 "text/html"内容;查看WebClient.builder().exchangeStrategies(ExchangeStrategies)设置方法
  2. 快速更改“ 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;
  }
}

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



 类似资料:
  • 目前我有一个问题与新的Spring5WebClient,我需要一些帮助来解决它。问题是: 我请求一些url返回内容类型为text/html;charset=utf-8的json响应。 顺便说一句,我在accept头中指向哪种类型并不重要,总是返回text/html。那么如何最终转换我的响应呢?

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

  • 问题内容: 我发现调整图像大小以使其具有响应能力很棘手。 我正在开发一个php应用程序,以自动将网站转换为响应版本。我有点卡在图像上。 我已经成功将包装类添加到网站上的每个图像,并且可以很好地调整图像的大小。 我的问题在于图像自然小于窗口,例如徽标和图标。我不想调整这些大小。 我的代码当前会转换: 变成: 我在哪里使用以下CSS: 这将调整所有图像的大小,但是我只希望它调整超出页面宽度的图像的大小

  • 因此,我试图使用wiremck向带有请求正文的URL发出后请求,然后使用我的respons.json文件返回响应。(自定义响应) 我就是这样设置的,但我似乎找不到任何关于如何设置带有请求主体的post存根(包含数据,比如说尝试创建ID),然后检索自定义响应主体(从json文件创建ID响应)的信息。我该怎么设置呢。我尝试通过json文件请求生成id,然后尝试检索创建的id。 WithBodyFile

  • 如何将响应从反应型HTTP客户机流式传输到控制器,而不在任何时候将整个响应主体放在应用程序内存中? 几乎所有project reactor客户机的示例都返回。据我所知,反应流是关于流,而不是加载它,然后发送响应。 是否可以返回,以便在不需要使用大量RAM内存来存储中间结果的情况下,将大文件从某个外部服务传输到应用程序客户机?

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