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("'", "'"); 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
相关产品推荐
相关产品推荐

