SpringCloud OpenFeign:使用内容类型为 text/html 的响应
Posted
技术标签:
【中文标题】SpringCloud OpenFeign:使用内容类型为 text/html 的响应【英文标题】:SpringCloud OpenFeign: consume response with content type text/html 【发布时间】:2021-11-19 09:03:52 【问题描述】:我正在使用 SpringCloud openfeign 调用另一个不属于我们团队的微服务。 当我定义这个 feignclient 时。
@FeignClient(name="test, url="/test")
public interface MyFeignClient
@GetMapping("/hello)
MyCustomRespone getValuesFromOtherService(@RequestParam String name, @RequestParam int id);
调用时出现异常:Spring Feign:无法提取响应:没有找到适合响应类型的HttpMessageConverter
然后我尝试从io.github.openfeign添加feign-jackson
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-jackson</artifactId>
</dependency>
但它仍然显示相同的异常。 然后我注意到我调用的其余api返回的上下文类型是“text/html”。我可以使用ObjectMapper进行分析,但这似乎不是一个好方法它。
那么有没有办法解决这个问题,注意我不能修改不属于out team的api。
【问题讨论】:
那你想做什么?将 html 响应转换为 Java 对象? 【参考方案1】:由于您在调用 api 时收到了 html 类型的响应,因此您需要为此编写自定义的 httpMessageConverter。另外请确保更新支持的媒体类型: super.setSupportedMediaTypes(types);请参考:https://www.javadevjournal.com/spring/spring-http-message-converter/ 您还可以尝试将消息提取为字符串并使用 Gson 转换器。例如:GsonHttpMessageConverter
public class CustomHttpMessageConverter extends GsonHttpMessageConverter
public MyGsonHttpMessageConverter()
List<MediaType> types = Arrays.asList(
new MediaType("text", "html", DEFAULT_CHARSET)
);
super.setSupportedMediaTypes(types);
【讨论】:
【参考方案2】:我遇到了完全相同的问题,我通过创建一个使用 Jackson 的自定义解码器解决了这个问题
@Bean
public Decoder feignDecoder()
return (response, type) ->
String bodyStr = Util.toString(response.body().asReader(Util.UTF_8));
JavaType javaType = TypeFactory.defaultInstance().constructType(type);
return new ObjectMapper().readValue(bodyStr, javaType);
;
然后我配置了 feign 来使用这个配置。
@FeignClient(url = "https://myurl.com", name = "client-name", configuration = FeignCustomConfiguration.class)
【讨论】:
以上是关于SpringCloud OpenFeign:使用内容类型为 text/html 的响应的主要内容,如果未能解决你的问题,请参考以下文章
06.springcloud服务通信组件之OpenFeign
SpringCloud04_OpenFeign的概述(远程调用)基本使用超时控制日志打印功能
springCloud之openfeign使用入门,Get/Post请求,Feign扩展连接池
SpringCloud原理:OpenFeign之FeignClient动态代理生成原理