【问题标题】:Disable RestTemplate escaping禁用 RestTemplate 转义
【发布时间】: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


【解决方案1】:

似乎没有干净的方法可以用 Spring 类来做到这一点。
最后我选择了原始的HttpURLConnection,虽然它不那么易于使用,但无论如何都提供了所有必需的功能。

事情在内部,用于构建最终 URI 的 DefaultUriBuilderFactory 使用遵循 RFC 规则的 java.net.URI 类。

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,您将无法避免这种情况。

【讨论】:

    猜你喜欢
    • 2015-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-03
    相关资源
    最近更新 更多