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

RestTemplate调用REST服务出现415 UNSUPPORTED_MEDIA_TYPE错误求助

解决RestTemplate调用REST服务时的415 UNSUPPORTED_MEDIA_TYPE错误

首先,415错误本质是客户端发送的媒体类型不被服务端接受,或者请求的Content-Type与实际发送的请求体格式不匹配。结合你的代码,我帮你梳理几个可能的问题和解决方向:

一、先确认服务端实际支持的媒体类型

这是最关键的第一步!你需要对照服务端的API文档,确认它期望的Content-Type到底是什么:

  • 如果服务端要求的是application/json,那你当前用application/x-www-form-urlencoded的格式肯定会报错,得调整请求体和头部。
  • 如果服务端明确支持application/x-www-form-urlencoded,再往下排查代码问题。

二、针对服务端接受form-urlencoded的情况,调整代码细节

你的代码框架是对的,但可能有几个细节需要优化:

1. 避免完全替换默认的消息转换器

你当前用restTemplate.setMessageConverters(converters)直接替换了所有默认转换器,可能会丢失一些必要的转换器(比如处理响应的JSON转换器,如果服务端返回JSON的话)。建议改成添加转换器到列表头部,保留默认的其他转换器:

RestTemplate restTemplate = new RestTemplate();
// 先获取默认转换器列表,再添加自定义的到最前面
List<HttpMessageConverter<?>> converters = restTemplate.getMessageConverters();
converters.add(0, new FormHttpMessageConverter());
converters.add(1, new StringHttpMessageConverter(StandardCharsets.UTF_8));

2. 明确设置字符编码

给FormHttpMessageConverter和StringHttpMessageConverter指定UTF-8编码,避免因编码不一致导致服务端解析失败:

FormHttpMessageConverter formConverter = new FormHttpMessageConverter();
formConverter.setCharset(StandardCharsets.UTF_8);

StringHttpMessageConverter stringConverter = new StringHttpMessageConverter(StandardCharsets.UTF_8);

3. 检查请求体是否为空或格式错误

确保bonitaUsername和bonitaPassword不是空值,而且MultiValueMap的键名和服务端要求的完全一致(比如是不是需要userName而不是username?大小写是否匹配?)

三、如果服务端要求JSON格式,修改请求方式

如果服务端期望的是application/json,那需要彻底调整请求格式:

RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);

// 构建JSON请求体,可以用Map或者自定义DTO类
Map<String, Object> requestBody = new HashMap<>();
requestBody.put("username", bonitaUsername);
requestBody.put("password", bonitaPassword);
requestBody.put("redirect", false);

HttpEntity<Map<String, Object>> httpEntity = new HttpEntity<>(requestBody, headers);
ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.POST, httpEntity, String.class);

// 后续处理cookie的逻辑不变
List<String> cookies = response.getHeaders().get("Set-Cookie");
String cookieString = "";
for (String cookie : cookies) {
    cookieString += cookie.split(";")[0] + "; ";
}
return cookieString;

四、用工具验证请求是否正确

你可以先用Postman或者curl发送相同参数的请求,验证服务端是否能正常响应:

# 测试form-urlencoded格式
curl -X POST -H "Content-Type: application/x-www-form-urlencoded" -d "username=your-username&password=your-password&redirect=false" your-api-url

# 测试JSON格式
curl -X POST -H "Content-Type: application/json" -d '{"username":"your-username","password":"your-password","redirect":false}' your-api-url

如果curl能成功,那问题肯定在你的代码里;如果curl也返回415,那需要联系服务端开发确认API的正确调用方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 14:32:55