【问题标题】:How to disable encoding using RestTemplate如何使用 RestTemplate 禁用编码
【发布时间】:2015-12-14 12:43:12
【问题描述】:

我正在使用 REST 模板有意在请求 uri 中发送 %,例如 /items/a%b

String responseEntity = restTemplate.exchange("/items/a%b",
             requestObj.getHttpMethod(), requestEntity, String.class);

restTemplate 正在转换这个 uri 的结尾,它正在变成/items/a%25b,这是有道理的,因为默认情况下其余模板对 uri 进行编码。

我尝试使用 UriComponent 禁用 uri 的编码

UriComponents uriComponents = UriComponentsBuilder.fromPath("/items/a%b").build();
URI uri= uriComponents.toUri();

String responseEntity = restTemplate.exchange(uri,
             requestObj.getHttpMethod(), requestEntity, String.class);

但这不起作用,因为 uri 再次属于进行编码的 URI 类型。我确定我没有以正确的方式使用 UriComponents。

如果有人能指出禁用编码的正确方法,我将不胜感激。

谢谢。

【问题讨论】:

  • 您说要发送的请求是非法的。为什么你认为你需要一个悬空百分号?
  • 我正在编写一个测试以使服务器优雅地处理它。它用于命中远程服务器的完整集成测试。所以没有什么是嘲笑的。
  • 服务器不应该“优雅地”处理它,它应该返回 400 错误。
  • 这就是我需要测试服务器返回400,但问题是restTemplate客户端无法发送请求。我使用 fiddler 进行了尝试,客户端能够在 uri 中使用 % 发送请求。

标签: java spring spring-mvc resttemplate


【解决方案1】:

来自 UriComponentsBuilder 文档,存在方法 build(boolean encoded)

build(boolean encoded) 从 此构建器中包含的各种组件。

UriComponents uriComponents = UriComponentsBuilder.fromPath("/items/a%b").build(true);

【讨论】:

  • 当您不想停止对所有 RestTemplate 用法的编码时,这是最佳答案。
【解决方案2】:

我觉得这是在 RestTemplate 中禁用编码的最佳方法,对我来说效果很好

@Bean
public RestTemplate getRestTemplate() {
    RestTemplate restTemplate = new RestTemplate();
    DefaultUriBuilderFactory defaultUriBuilderFactory = new DefaultUriBuilderFactory();
    defaultUriBuilderFactory.setEncodingMode(DefaultUriBuilderFactory.EncodingMode.NONE);
    restTemplate.setUriTemplateHandler(defaultUriBuilderFactory);
    return restTemplate;
}

【讨论】:

  • 它按预期工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-06
  • 2014-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-14
相关资源
最近更新 更多