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
相关产品推荐
相关产品推荐

