Could not extract response:no suitable HttpMessageConverter found for

打印 上一主题 下一主题

主题 894|帖子 894|积分 2682

哀求三方接口时,对方返回的响应数据是text/html类型 怎么处理
原来的调用方式 默认只处理text/json类型的数据
  1. public static JSONObject post(String url, HttpHeaders headers, Map<String, Object> body) {
  2.         RestTemplate restTemplate = new RestTemplate(factory);
  3.         HttpEntity<String> entity = new HttpEntity<>(JSON.toJSONString(body), headers);
  4.         try {
  5.             log.info("地址:" + url);
  6.             JSONObject response = restTemplate.postForObject(url, entity, JSONObject.class);
  7.             log.info("请求发送成功");
  8.             return response;
  9.         } catch (Exception e) {
  10.             log.error("请求失败", e);
  11.             throw e;
  12.         }
  13.     }
复制代码
原来的处理方式把接口的响应转为Json类型,但对方的响应是text/html类型,报错如下

第一次尝试把调用接口返回的数据先从String吸收再进一步处理,奈何吸收还是出现异常。
同接口方沟通 对方不理解什么是text/json 大概 text/html  处理起来较为麻烦(ps:或许也是我理解的有题目)
第二次尝试直接处理text/html类型数据
由于工具类是直接封装了restTemplate的调用,故从restTemplate入手
声明restTemplate-->createRestTemplate 能够处理text/html的数据
  1. private static final RestTemplate restTemplate = createRestTemplate();
复制代码
createRestTemplate的代码如下:
  1. private static RestTemplate createRestTemplate() {
  2.         RestTemplate restTemplate = new RestTemplate();
  3.         FastJsonHttpMessageConverter fastJsonHttpMessageConverter = new FastJsonHttpMessageConverter();
  4.         fastJsonHttpMessageConverter.setSupportedMediaTypes(Collections.singletonList(MediaType.ALL));
  5.         restTemplate.getMessageConverters().add(0, fastJsonHttpMessageConverter);
  6.         restTemplate.getMessageConverters().add(new StringHttpMessageConverter(StandardCharsets.UTF_8));
  7.         return restTemplate;
  8.     }
复制代码
其中的FastJsonHttpMessageConverter说明:

  • 是一种HttpMessageConverter的实现,利用FastJSON库来序列化和反序列化JSON数据。它可以将Java对象转换为JSON格式(序列化),以及将JSON数据转换为Java对象(反序列化)。
  • setSupportedMediaTypes属性:设置该转换器支持的媒体类型为 MediaType.ALL,表示接受所有媒体类型的哀求或响应。
  • getMessageConverters().add(0, fastJsonHttpMessageConverter):表示优先处理JSON数据
  • getMessageConverters().add(new StringHttpMessageConverter(StandardCharsets.UTF_8)),用于处理字符串数据的消息转换器,支持将Http响应直接解析为字符串,大概将字符串作为哀求体发送。
按照createRestTemplate声明的restTemplate的举行调用 吸收的返回数据仍以String的方式吸收 再转为Json处理
  1. public static JSONObject postForIcp(String url, Map<String, Object> body) {
  2.         HttpHeaders headers = new HttpHeaders();
  3.         headers.setContentType(MediaType.APPLICATION_JSON);
  4.         HttpEntity<String> entity = new HttpEntity<>(JSON.toJSONString(body), headers);
  5.         try {
  6.             ResponseEntity<String> response = restTemplate.postForEntity(url, entity, String.class);
  7.             if (response.getStatusCode().is2xxSuccessful()) {
  8.                 String responseBody = response.getBody();
  9.                 log.info("响应: " + responseBody);
  10.                 return JSON.parseObject(responseBody);
  11.             } else {
  12.                 log.error("请求失败,状态码: " + response.getStatusCodeValue());
  13.                 throw new RuntimeException("请求失败,状态码: " + response.getStatusCodeValue());
  14.             }
  15.         } catch (Exception e) {
  16.             log.error("请求失败", e);
  17.             throw e;
  18.         }
  19.     }
复制代码
数据成功吸收并处理。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

三尺非寒

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表