【问题标题】:WebClient's bodyToMono errorWebClient 的 bodyToMono 错误
【发布时间】:2018-08-29 13:48:20
【问题描述】:

我正在使用 Spring 5 WebClient 进行外部 api 调用,并希望将响应映射到这样的对象:

@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public static class Response {
    private long length;
}

private Mono<Response> getResponse() {
    return webClient.get()
            .uri("someURI")
            .accept(MediaType.APPLICATION_JSON_UTF8)
            .retrieve()
            .bodyToMono(Response.class);
}

但我得到一个错误:

org.springframework.web.reactive.function.UnsupportedMediaTypeException: Content type 'application/octet-stream' not supported

但是,如果我像这样将响应正文提取到字符串:

private Mono<String> getResponse() {
return webClient.get()
        .uri("someURI")
        .accept(MediaType.APPLICATION_JSON_UTF8)
        .retrieve()
        .bodyToMono(String.class); 
}

然后它可以正常工作。任何想法如何解决这个问题?

编辑

响应正文:

{
  "blocks": [
  {
  "height": 545551,
  "size": 48289,
  "virtualSize": 48289,
  "hash": "000000000000000000541d265115ec188544420c4b0e5dff6f2171e17e4991c9",
  "time": 1535551238,
  "txlength": 80,
  "poolInfo": {}
  }
  ],
  "length": 1,
  "pagination": {
  "next": "2018-08-30",
  "prev": "2018-08-28",
  "currentTs": 1535587199,
  "current": "2018-08-29",
  "isToday": true,
  "more": true,
  "moreTs": 1535587200
  }
}

标题:

status: 200 OK

【问题讨论】:

  • 没有 Content-Type 响应头?
  • @BrianClozel 是的,就是这样,将 API 更改为带有 Content-Type 标头的 API,一切正常,谢谢 ;)

标签: java spring spring-webflux project-reactor


【解决方案1】:

如果 HTTP 响应没有 Content-Type 标头,客户端将假定 application/octet-stream,这不是 Spring WebFlux 中的 Jackson 编解码器支持的 Content-Type。

所以您看到的行为是预期的行为,应该修复 Web API 以添加响应标头。

【讨论】:

  • 您可以重新配置编解码器(请参阅ClientCodecConfigurer)或添加WebFilter,在某些情况下更改响应的内容类型。这实际上取决于您的客户端请求什么以及远程服务器的行为方式
猜你喜欢
  • 2019-09-27
  • 1970-01-01
  • 2020-08-02
  • 2022-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-29
相关资源
最近更新 更多