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

