You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot中RestTemplate认证出现415 UNSUPPORTED_MEDIA_TYPE错误求助

解决RestTemplate调用OAuth2认证接口返回415 UNSUPPORTED_MEDIA_TYPE的问题

问题分析

415错误核心原因是RestTemplate未正确处理application/x-www-form-urlencoded类型的请求体,或请求头设置与服务器预期不匹配。对比你的Jersey代码和Postman请求,差异点在于RestTemplate对请求体类型的识别逻辑以及Content-Type头的处理方式。

解决方案

方案1:修正HttpEntity的泛型声明(避免Raw类型)

你的代码中HttpEntity使用了Raw类型,导致RestTemplate无法正确识别请求体类型,进而无法匹配对应的消息转换器处理表单数据。修改代码如下:

HttpHeaders headers = new HttpHeaders();
headers.add("Authorization", "Basic xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx==");
headers.add("Accept", "application/json");
// 移除手动设置的Content-Type,让RestTemplate自动处理
// headers.add("Content-Type","application/x-www-form-urlencoded");

MultiValueMap<String, String> requestBody = new LinkedMultiValueMap<>();
requestBody.add("grant_type", "client_credentials");

// 明确指定HttpEntity的泛型类型
HttpEntity<MultiValueMap<String, String>> formEntity = new HttpEntity<>(requestBody, headers);

String serverEndPoint = "https://xxxxxxx.xxx/auth/oauth2/xx/token";

ResponseEntity<String> response = restTemplate.exchange(serverEndPoint, HttpMethod.POST, formEntity, String.class);
System.out.println(response.getStatusCode().value());

方案2:让RestTemplate自动处理Content-Type头

当使用MultiValueMap作为请求体时,RestTemplate默认的FormHttpMessageConverter会自动设置Content-Type: application/x-www-form-urlencoded;charset=UTF-8头,无需手动添加。手动设置的无charset的Content-Type可能不符合服务器的严格要求。

方案3:确保RestTemplate包含FormHttpMessageConverter(可选)

默认new RestTemplate()会自动注册该转换器,但如果RestTemplate被修改过(比如移除了默认转换器),可手动添加:

@Bean
public RestTemplate getRestTemplate() {
    RestTemplate restTemplate = new RestTemplate();
    // 检查并添加FormHttpMessageConverter
    boolean hasFormConverter = restTemplate.getMessageConverters().stream()
            .anyMatch(converter -> converter instanceof FormHttpMessageConverter);
    if (!hasFormConverter) {
        restTemplate.getMessageConverters().add(new FormHttpMessageConverter());
    }
    restTemplate.setErrorHandler(new DefaultResponseErrorHandler() {
        @Override
        public void handleError(ClientHttpResponse response) throws IOException {
            // don't throw
        }
    });
    return restTemplate;
}

验证说明

修改后,RestTemplate会正确将MultiValueMap转换为表单编码格式的请求体,并带上符合服务器要求的Content-Type头,与Postman、Jersey的请求逻辑保持一致,即可解决415错误。

内容的提问来源于stack exchange,提问作者user2486322

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 23:20:42