Spring RestTemplate调用接口始终返回500但Postman测试正常怎么解决
问题根因
你遇到的ArgumentCountError是参数计数错误,本质是RestTemplate构造的请求url和Postman的请求url不一致,后端无法正确识别传入的参数数量:
- 你当前代码中
UriComponentsBuilder调用encode()后生成url字符串,会把参数名rsargs[]里的方括号编码为%5B%5D - RestTemplate接收字符串类型的url时默认会做二次编码,最终参数名会被双重编码,后端完全识别不到
rsargs[]数组参数,判定为缺少必填参数抛出500错误 - Postman默认不会对url中的方括号做编码,参数可被后端正常解析,所以返回200
解决方案
修改UriComponentsBuilder的使用逻辑,直接构造URI对象而非字符串传入RestTemplate,避免二次编码,同时仅对参数值做UTF-8编码,保留参数名的方括号:
private String callWs(int page) { final HttpHeaders headers = new HttpHeaders(); headers.add(HttpHeaders.USER_AGENT, "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36"); headers.add(HttpHeaders.ACCEPT, "*/*"); // 可临时注释该配置测试,避免RestTemplate无法自动解压缩gzip响应 // headers.add(HttpHeaders.ACCEPT_ENCODING, "gzip, deflate, br"); headers.add(HttpHeaders.CONNECTION, "keep-alive"); headers.add(HttpHeaders.COOKIE, "country-code=MA"); headers.add(HttpHeaders.CACHE_CONTROL, "no-cache"); final HttpEntity<?> entity = new HttpEntity<>(headers); // 构造URI对象而非字符串,避免RestTemplate二次编码 final URI uri = UriComponentsBuilder.fromHttpUrl(BASE_URL2) .queryParam("action", "ajax") .queryParam("rs", "JsonCategories") .queryParam("rsargs[]", "1") .queryParam("rsargs[]", "معلومات_ونصائح_طبية") .encode(StandardCharsets.UTF_8) .build() .toUri(); final ResponseEntity<String> exchange = restTemplate.exchange( uri, HttpMethod.GET, entity, String.class); return exchange.getBody(); }
如果修改后仍报错,可关闭RestTemplate的自动编码机制:
// 初始化RestTemplate时添加该配置 DefaultUriBuilderFactory uriBuilderFactory = new DefaultUriBuilderFactory(); uriBuilderFactory.setEncodingMode(DefaultUriBuilderFactory.EncodingMode.NONE); restTemplate.setUriTemplateHandler(uriBuilderFactory);
验证方法
调用接口前打印最终生成的URI,和Postman中的请求url做对比,只要两者参数名、参数值的编码格式完全一致,即可正常请求成功。
内容的提问来源于stack exchange,提问作者hamwac5
相关产品推荐
相关产品推荐

