Spring Web REST调用特殊字符编码异常,如何避免手动编解码?
根本原因
特殊字符转空格问题本质是URL编码规则不匹配:
UriComponentsBuilder默认遵循RFC 3986编码规范,该规范中+、|不属于必须编码的字符,会直接拼接在URL中- 服务端解析GET参数时默认遵循
application/x-www-form-urlencoded规范,会将URL中的+解析为空格,未编码的|也会被特殊处理
无需手动编解码的解决方案
方案1:调整UriComponentsBuilder用法,显式编码生成URI对象
不要调用builder.build().toString(),直接生成编码后的URI对象传给RestTemplate即可避免编码失效:
final String url = baseUrl() + "/getOrders"; final UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(url); builder.queryParam("username", username); // 直接生成编码后的URI对象,无需转字符串 URI requestUri = builder.build().encode(StandardCharsets.UTF_8).toUri(); final ResponseEntity<TResponse> restResp = restTemplate.exchange(requestUri, HttpMethod.GET, entity, OrdersResult.class);
该方式下Spring会自动按照URL参数规范完成编码,服务端可直接拿到原始的username值,不需要手动解码。
方案2:使用RestTemplate占位符传参,由框架自动编码
直接将参数写入URL占位符中,RestTemplate会自动完成参数编码:
String url = baseUrl() + "/getOrders?username={username}"; Map<String, Object> params = Collections.singletonMap("username", username); final ResponseEntity<TResponse> restResp = restTemplate.exchange(url, HttpMethod.GET, entity, OrdersResult.class, params);
方案3:特殊字符较多时优先用POST请求传输
如果username会频繁出现各类特殊字符,直接改为POST请求将参数放在请求体中传输,完全规避URL编码问题:
客户端调整为POST传参,服务端接口对应调整为RequestMethod.POST,参数用@RequestBody接收即可。
内容的提问来源于stack exchange,提问作者johnny-b-goode
相关产品推荐
相关产品推荐

