【发布时间】:2019-03-26 13:21:00
【问题描述】:
我必须调用的现有 API 接受表单中的查询参数
?key=001|ABC|123456
但是RestTemplate,使用其内部UriBuilder 将| 字符转义为%7C。
因此参数导致
?key=001%7CABC%7C123456
我尝试通过setUriTemplateHandler 设置自定义UriTemplateHandler,使用新的DefaultUriBuilderFactory
final var uriBuilder = new DefaultUriBuilderFactory();
并禁用编码和解析
uriBuilder.setEncodingMode(EncodingMode.NONE);
uriBuilder.setParsePath(false);
但是在构造 URI 时在内部引发了另一个异常
URI.create(url)
说存在非法字符,显然是|。
如何在 Spring 中使用 RestTemplate 完全禁用此行为?
我不能使用转义值。
通过 SoapUI 执行相同的调用,使用非转义的 URL,返回正确的响应。
【问题讨论】:
-
它总是会创建一个 URI,它是一个 java 类,与 Spring 无关。
|是请求中的非法字符,必须进行编码。即使你会放|在 URL 中,浏览器实际上会对实际请求进行编码。 -
@M.Deinum 我知道它无效,应该转义。但是,如果我转义它,远程 API 将无法正常运行。尝试在 SOAP-UI 中未转义的 URL 会得到正确的响应。
-
URI类只允许有效的 URL AFAIK(这是一个常规的 java 类,与 Spring 无关)。 -
@M.Deinum 问题是
URI类在内部被UriBuilderFactory使用,这是一个Spring 组件。我想避免处理原始的HttpURLConnection -
内部使用
URL,我认为会受到同样的影响。
标签: spring spring-boot resttemplate