2017-01-23 7 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 템플릿의 구문과 관련된 설명서가 있는지 알고 계십니까?

저는 현재 스프링의 자바 소스를 통해 갈 것이며 결국에는 해결책을 찾아 낼 수 있어야합니다. 그러나 실제로 저를 괴롭히는 것은 문서 또는 제 3 자 정보가 부족하다는 것입니다.

미리 감사드립니다.

+0

좋아, 무슨 일이 일어나는지 알았어. 약식 표기법 'http://corpdomain.com/service {? idparam}'은 Spring 라이브러리 중 하나가 아니기 때문에 Affordance 라이브러리 (https://github.com/dschulten/hydra-java)를 사용하여 구성됩니다. 하지만 Spring이나 Affordance가 왜 URI 템플릿 형식을 문서화하려했는지 이해하지 못합니다. – Alexander

답변

0

해당 구문에 익숙하지 않습니다. 그러나 나는 BASE_SERVICE_URL을 정의하고 URL을 만들기 위해 UriComponentsBuilder과 함께 사용합니다. http://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/client/RestTemplate.html

하거나 다른 당신이 빌드를 사용하고 방법을 확장 할 수 있습니다 : 그것은 당신이 getForObject 방법의 일부

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

문서로 URI 변수를 전달할 수 있습니다이

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 level 4]를 반환합니다 (https://tools.ietf.org/html /rfc6570#section-3.2.8) 표준 URI 템플릿. Spring은 레벨 1 만 이해합니다. – dschulten

0

과 같을 것 UriComponents 빌더는 다음과 같습니다.

 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 

, 검색어 매개 변수는 아래와 같이 할 수있는, 당신이 건네받을 것입니다 어떤 URL 확실하지 않은 같은 동적 : 서비스가 RFC 6570 URI 템플릿을 반환처럼

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);