2017-01-23 106 views
0

在我的项目中,我在客户端应用程序中使用RestTempate来访问现有服务。服务本身返回的有效URI模板列表,以及一个我试图用看起来像RestTemplate URI模板语法

http://corpdomain.com/service{?idparam} 

在运行时,它应该扩展到像

http://corpdomain.com/service?idparam=12345 

问题是,RestTemplate的getForObject( )不知道如何处理“{?idparam}”表示法。如果我给它提供URI http://corpdomain.com/service?idparam={idparam},一切工作正常。但这不是服务器返回给我的URI模板。

你知道如何在模板中使用{?idparam}类型表示法处理RestTemplate.getForObject()吗?

你知道是否有关于URI模板语法的任何文档?

我目前正在浏览spring的java源代码,最终应该能够找出解决方案。但是,真正让我感到困惑的是缺少文档或第三方信息。

谢谢大家提前!

+0

好吧,看起来像我找出了发生了什么。速记符号“http://corpdomain.com/service {?idparam}”不是来自任何Spring库,而是使用Affordance库(https://github.com/dschulten/hydra-java)构建的。但我仍不明白为什么Spring和Affordance都没有试图记录他们正在使用的URI模板格式。 – Alexander

回答

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); 
    } 
+0

这种方法可行,但是,我的问题是我试图不自己构建URI。我试图依靠服务返回给我的模板,所以我的客户不需要有知识来做'。queryParam(“idparam”,idparam)' – Alexander

+0

如果服务器返回一个非标准的语法,你将不得不在你的端做一些解析来将{?somequerystringvar}转换成一些春天会理解的东西。我可能是错的,但是我之前没有看到过这种语法,它可能是我知道的所有标准。也许你可以实现一种方法,将URI中的{?queryparam}发生的所有事件发送到?queryparam = queryparamvalue语法 – ferahgo

+0

@ferahgo服务器返回[rfc6570级别4](https://tools.ietf.org/html /rfc6570#section-3.2.8)标准的uri模板。春天只能理解1级。 – dschulten

0

您可以通过URI变量

getForObject(String url, Class<T> responseType, Map<String,?> uriVariables) 

文档getForObject方法的一部分:http://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/client/RestTemplate.html

否则,您可以利用构建和扩展的方法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);