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

Java URL编码撇号、空格转义异常(输出%2527)如何解决?

根因说明

出现%2527是重复URL编码导致的:你手动调用URLEncoder.encode把'转成了%27,后续UriComponentsBuilder会自动对参数值做二次编码,把%转义为%25,最终拼接得到错误的%2527结果。

修复方案

两种实现方式都可以达到预期编码效果,按需选择即可:

方案1:保留手动编码,关闭UriComponentsBuilder自动编码

你已经手动完成了编码操作,只需要在生成URI时关闭自动编码逻辑,避免二次转义,调整后代码如下:

lastName = lastName.replace("'", "'");
HttpEntity<String> entity = new HttpEntity<>(getHttpHeaders());
UriComponentsBuilder uriBuilder = UriComponentsBuilder.fromUriString(baseUrl + "/idsearch")
        .queryParam("lastname", URLEncoder.encode(lastName, "UTF-8"))
        .queryParam("dateOfBirth", birthday);
// build方法传入false关闭自动编码
URI uri = uriBuilder.build(false).toUri();
ResponseEntity<Response> result = restTemplate.exchange(uri,
                    HttpMethod.GET, entity, Response.class);

方案2:删除手动编码逻辑,交由UriComponentsBuilder统一处理

不需要自己调用编码方法,直接把原始字符串传入queryParam,由框架完成所有编码操作,调整后代码如下:

lastName = lastName.replace("&apos;", "'");
HttpEntity<String> entity = new HttpEntity<>(getHttpHeaders());
// 直接传入原始lastName,不做手动编码
UriComponentsBuilder uriBuilder = UriComponentsBuilder.fromUriString(baseUrl + "/idsearch")
        .queryParam("lastname", lastName)
        .queryParam("dateOfBirth", birthday);
ResponseEntity<Response> result = restTemplate.exchange(uriBuilder.toUriString(),
                    HttpMethod.GET, entity, Response.class);

调整后Mc' Donald最终编码结果为Mc%27+Donald,符合撇号转义为%27、空格转义为+的要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 21:42:02