spring resttemplate url编码

新手上路,请多包涵

我尝试使用 springs resttemplate 进行简单的 rest 调用:

 private void doLogout(String endpointUrl, String sessionId) {
    template.getForObject("http://{enpointUrl}?method=logout&session={sessionId}", Object.class,
            endpointUrl, sessionId);
}

其中 endpointUrl 变量包含类似 service.host.com/api/service.php 的内容

不幸的是,我的调用导致 org.springframework.web.client.ResourceAccessException: I/O error: service.host.com%2Fapi%2Fservice.php

所以 spring 似乎在创建 url 之前对我的 endpointUrl 字符串进行了编码。有没有一种简单的方法可以防止 spring 这样做?

问候

原文由 user1145874 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 923
2 个回答

没有简单的方法可以做到这一点。 URI 模板变量通常用于路径元素或查询字符串参数。您正在尝试通过主机。理想情况下,您会找到构建 URI 的更好解决方案。我建议 榆次的解决方案

如果您仍想使用 Spring 实用程序和模板扩展,一种解决方法是使用 UriTemplate 生成带有 URI 变量的 URL,然后对其进行 URL 解码并将其传递给您的 RestTemplate

 String url = "http://{enpointUrl}?method=logout&session={sessionId}";
URI expanded = new UriTemplate(url).expand(endpointUrl, sessionId); // this is what RestTemplate uses
url = URLDecoder.decode(expanded.toString(), "UTF-8"); // java.net class
template.getForObject(url, Object.class);

原文由 Sotirios Delimanolis 发布,翻译遵循 CC BY-SA 4.0 许可协议

取决于您使用的是哪个版本的 Spring。如果您的版本太旧,例如版本 3.0.6.RELEASE ,您的 spring-web jar 将没有 UriComponentsBuilder 这样的设施。

您需要做的是防止 Spring RestTemplate 对 URL 进行编码。你可以做的是:

 import java.net.URI;

StringBuilder builder = new StringBuilder("http://");
builder.append(endpointUrl);
builder.append("?method=logout&session=");
builder.append(sessionId);

URI uri = URI.create(builder.toString());
restTemplate.getForObject(uri, Object.class);

我用 Spring 版本 3.0.6.RELEASE 测试了它,它可以工作。

总之,不要使用 restTemplate.getForObject(String url, Object.class) ,而是使用 restTemplate.getForObject(java.net.URI uri, Object.class)

请参阅 Spring 文档的 rest-resttemplate-uri 部分

原文由 Yuci 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题