我正在与RestTemplate
进行REST调用,并且我有一个包含斜杠的uriparam(即20/20)
在调用RestTemplate
之前,我将uriParam转换为使用http编码转换为20%2f20
。
当我调用RestTemplate时,它会将%
转换为%25
,并且我收到的数据不正确。
可以在param中使用斜杠调用restTemplate吗?
谢谢!
代码示例:
String urlExample="www.nowhere.com/?variable={variable}";
String variable = URLEncoder.encode( "20/20", java.nio.charset.StandardCharsets.UTF_8.toString() );
Map< String, String > uriVariables = new HashMap<>();
uriVariables.put( "variable", variable );
restTemplate.exchange( urlExample, HttpMethod.GET, new HttpEntity<>, String.class, uriVariables );
如果我不执行httpEncoder,我会获得对http://www.nowhere.com/?variable=20/20的休息调用,而值变量get仅为20。
如果我执行httpEncoder,变量的值是%2F(这是正确的,这是我想要的值),但是当我执行其余操作时,它会调用:http://www.nowhere.com/?variable=20%252F20。
似乎RestTemplate编码为HttpEncoding%to%25并且它打破了我的呼叫。可以避免这种编码吗?
解决:
如果指示restTemplate使用URI而不是String,则RestTemplate会避免编码。
为了使用params构建uri,最好的方法是使用UriComponentsBuilder指示uri实际上是在build()参数中编码的。
答案 0 :(得分:0)
为您的测试处理程序尝试以下逻辑,可以是“www.nowhere.com/a/b/c
”,您将使用以下机制获得整个值。
requestedUri = (String)
request.getAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE);
答案 1 :(得分:0)
您可以按以下方式配置RestTemplate:
DefaultUriTemplateHandler uriTemplateHandler = new UriTemplateHandler();
uriTemplateHandler.setParsePath(true);
RestTemplate restTemplate = new RestTemplate();
restTemplate.setUriTemplateHandler(uriTemplateHandler);