禁用RestTemplate转义

时间:2019-03-26 13:21:01

标签: spring spring-boot resttemplate

我必须调用的现有API接受以下形式的查询参数

?key=001|ABC|123456

然而,RestTemplate使用其内部UriBuilder|字符转义为%7C
因此参数导致

?key=001%7CABC%7C123456

我尝试使用新的UriTemplateHandler通过setUriTemplateHandler设置自定义DefaultUriBuilderFactory

final var uriBuilder = new DefaultUriBuilderFactory();

并禁用编码和解析

uriBuilder.setEncodingMode(EncodingMode.NONE);
uriBuilder.setParsePath(false);

但是在构造URI

时会在内部引发另一个异常
URI.create(url)

说存在非法字符,显然是|

如何使用RestTemplate在Spring中完全禁用此行为?
我不能使用转义的值。

使用非转义的URL通过SoapUI执行相同的调用,将返回正确的响应。

1 个答案:

答案 0 :(得分:0)

Spring类似乎没有干净的方法。
最后,我选择了原始HttpURLConnection,它虽然不易使用,但仍然提供了所有必需的功能。

事情是内部的,DefaultUriBuilderFactory是用来构建最终URI的那个,它使用java.net.URI类,它遵循RFC规则。

private URI createUri(UriComponents uric) {
    if (encodingMode.equals(EncodingMode.URI_COMPONENT)) {
        uric = uric.encode();
    }
    return URI.create(uric.toString());
}

如您所见,即使您通过

禁用编码
uriBuilder.setEncodingMode(EncodingMode.NONE);

最终结果始终是调用URI.create
如果不能通过提供自定义UriBuilderFactory来避免这种情况。