RestTemplate URI模板语法

时间:2017-01-23 20:20:01

标签: java spring templates uri

在我的项目中,我在客户端应用中使用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源码,最终应该能够找到解决方案。但是,真正让我感到困惑的是缺少文档或第三方信息。

提前感谢大家!

3 个答案:

答案 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)

文档: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);

答案 2 :(得分:0)

该服务似乎返回了RFC 6570 URI模板,其中包含{?foo}{+foo}are not supported by Spring之类的符号。

有一个库Handy URI Templates,它实现了RFC 6570规范。