我必须调用的现有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执行相同的调用,将返回正确的响应。
答案 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
来避免这种情况。