Java RestTemplate报错Invalid mime type “charset=utf-8“: does not contain ‘/‘

文章目录

错误原因分析

这个错误表明服务器返回的 Content-Type 头部格式不正确,只包含了字符集信息而没有MIME类型。

错误信息springframework.http.InvalidMediaTypeException: Invalid mime type "charset=utf-8": does not contain '/' 表明服务器返回的 Content-Type 头部只包含了 "charset=utf-8" 而不是完整的 MIME 类型(如 "application/json;charset=utf-8")。

校验:

用post调用接口,查看header,发现 Content-Type = "charset=utf-8" 而不是 Content-Type = "application/json;charset=utf-8"

在 Spring 的 RestTemplate 中,当它尝试解析 HTTP 响应时,会检查 Content-Type 头部。如果该头部不是一个有效的 MIME 类型格式(缺少斜杠/),就会抛出 InvalidMediaTypeException 异常。


解决方案:

方案一:添加请求头_ACCEPT_头

通过显式设置接受的媒体类型,可以避免因服务器返回不完整 Content-Type 而导致的问题。

java 复制代码
HttpHeaders headers = new HttpHeaders();
headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
HttpEntity<?> entity = new HttpEntity<>(headers);

ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.GET, entity, String.class);
if (response.getStatusCode() == HttpStatus.OK) {
    // 其他逻辑
} else {
    throw new IOException("读取内容失败, code: " + response.getStatusCodeValue());
}

方法二:自定义RequestCallback和ResponseExtractor来绕过Content-Type检查

java 复制代码
 // 使用自定义RequestCallback和ResponseExtractor来绕过Content-Type检查
restTemplate.execute(url, HttpMethod.GET,
         request -> {
             // 设置Accept头
             request.getHeaders().setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
         },
         response -> {
             // 手动读取响应体,忽略Content-Type
             String body = StreamUtils.copyToString(response.getBody(), StandardCharsets.UTF_8);
             if (response.getStatusCode() == HttpStatus.OK) {
                 // 其他逻辑
             } else {
                 throw new IOException("读取文件内容失败, code: " + response.getStatusCode());
             }
         });

方案三:使用HttpURLConnection

java 复制代码
URL url = new URL(url);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(5000);  // 连接超时时间
conn.setReadTimeout(10000);    // 读取超时时间
conn.connect();
int responseCode = conn.getResponseCode();
if (responseCode != HttpURLConnection.HTTP_OK) {
    throw new IOException("读取文件内容失败,code : " + responseCode);
}
// 其他逻辑
相关推荐
Neoest2 小时前
【Java 填坑日记】Excel里的“1.00“存入数据库解密后,Integer说它不认识:一次 NumberFormatException 翻车实录
java·数据库·excel
~patience~2 小时前
简单易懂的计数器(理解Qt的信号和槽机制)
开发语言·qt
小坏讲微服务2 小时前
Spring Boot 4.0 新特性整合 MyBatis-Plus 完整教程
java·spring boot·后端·spring cloud·微服务·mybatis·mybatis plus
我命由我123452 小时前
Java 开发使用 MyBatis PostgreSQL 问题:传入的参数为 null,CONCAT 函数无法推断参数的数据类型
java·开发语言·数据库·学习·postgresql·mybatis·学习方法
爱装代码的小瓶子2 小时前
【c++知识铺子】map和set的底层-红黑树
java·开发语言·c++
小蒜学长2 小时前
基于Spring Boot家政服务系统的设计与实现(代码+数据库+LW)
java·数据库·spring boot·后端
洛阳泰山2 小时前
Java实现周易六爻自动排盘:根据卜卦的时间推算出天干地支
java·开发语言·周易·六爻
apihz2 小时前
随机英文姓名生成API接口详细教程:免费、简单、高效
android·java·运维·服务器·开发语言
a程序小傲2 小时前
百度Java面试被问:HTTPS解决了HTTP什么问题?
java·后端·http·百度·面试