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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 08:18:02