在我的项目中,我在客户端应用中使用RestTempate来访问现有服务。服务本身返回一个有效的URI模板列表,我尝试使用的模板看起来像
http://corpdomain.com/service{?idparam}
在运行时,它应该扩展为类似
http://corpdomain.com/service?idparam=12345
问题是,RestTemplate的getForObject()不知道如何处理" {?idparam}"符号。如果我给它提供URI
http://corpdomain.com/service?idparam={idparam}
,一切正常。但这不是服务器返回给我的URI模板。
你知道如何让RestTemplate.getForObject()在模板中使用{?idparam}类型表示法吗?
您知道是否有关于URI模板语法的任何文档?
我目前正在浏览spring的java源码,最终应该能够找到解决方案。但是,真正让我感到困惑的是缺少文档或第三方信息。
提前感谢大家!
答案 0 :(得分:0)
我不熟悉那种语法。不过,我会定义一个BASE_SERVICE_URL
并使用UriComponentsBuilder
来制作您的网址。它看起来像这样
private static final String BASE_SERVICE_URL = "http://corpdomain.com/service"
public void doTheThing(String idParam) {
...
UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(url)
.queryParam("idparam", idparam)
...
HttpEntity<String> response = restTemplate.exchange(
builder.build().encode().toUri(),
HttpMethod.GET,
entity,
String.class);
}
答案 1 :(得分:0)
您可以将uri变量作为getForObject方法的一部分传递
getForObject(String url, Class<T> responseType, Map<String,?> uriVariables)
或者您可以使用UriComponentsBuilder的构建和扩展方法,如下所示:
String url="http://localhost:8080/test?idparam={idparam}";
RestTemplate restTemplate=new RestTemplate();
Map<String,String> uriVariables=new HashMap<String,String>();
uriVariables.put("idparam", "1234");
UriComponents builder=UriComponentsBuilder.fromHttpUrl(url).buildAndExpand(uriVariables);
System.out.println(" url built "+builder.toUri());
输出:
url built http://localhost:8080/test?idparam=1234
如果查询参数是动态的,因为您不确定要传递的是什么网址,您可以执行以下操作:
UriComponentsBuilder builder=UriComponentsBuilder.fromHttpUrl(url);
Map<String,String> uriVariables =builder.build().getQueryParams().toSingleValueMap();
//set or get required query params
restTemplate.getForObject(url, String.class, uriVariables);
答案 2 :(得分:0)
该服务似乎返回了RFC 6570 URI模板,其中包含{?foo}
和{+foo}
等are not supported by Spring之类的符号。
有一个库Handy URI Templates,它实现了RFC 6570规范。