2014-02-17 2 views
12

API의 내용에 액세스하려고하고 있으며 RestTemplate을 사용하여 URL을 보내야합니다.Spring에서 RestTemplate 사용하기. 예외 - 확장 할 수있는 변수가 충분하지 않습니다.

String url1 = "http://api.example.com/Search?key=52ddafbe3ee659bad97fcce7c53592916a6bfd73&term=&limit=100&sort={\"price\":\"desc\"}"; 

OutputPage page = restTemplate.getForObject(url1, OutputPage .class); 

그러나 다음과 같은 오류가 발생합니다.

Exception in thread "main" java.lang.IllegalArgumentException: Not enough variable values available to expand '"price"' 
at org.springframework.web.util.UriComponents$VarArgsTemplateVariables.getValue(UriComponents.java:284) 
at org.springframework.web.util.UriComponents.expandUriComponent(UriComponents.java:220) 
at org.springframework.web.util.HierarchicalUriComponents.expandInternal(HierarchicalUriComponents.java:317) 
at org.springframework.web.util.HierarchicalUriComponents.expandInternal(HierarchicalUriComponents.java:46) 
at org.springframework.web.util.UriComponents.expand(UriComponents.java:162) 
at org.springframework.web.util.UriTemplate.expand(UriTemplate.java:119) 
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:501) 
at org.springframework.web.client.RestTemplate.getForObject(RestTemplate.java:239) 
at hello.Application.main(Application.java:26) 

정렬 기준을 제거하면 올바르게 작동합니다. 정렬 기준을 사용하여 JSON을 구문 분석해야합니다. 도움이 될 것입니다.

감사

답변

34

근본 원인은 RestTemplate 중괄호에게 URI 변수에 대한 자리 표시로 지정된 URL에서 {...}을 고려하고 자신의 이름을 기반으로 교체하려고한다는 것입니다. 예를 들어

{pageSize} 

pageSize라는 URI 변수를 좀하려고합니다. 이러한 URI 변수는 다른 오버로드 된 getForObject 메소드 중 일부와 함께 지정됩니다. 아무 것도 제공하지 않았지만 URL에 URL이 필요하므로 예외가 발생합니다.

하나의 솔루션은 값

String sort = "{\"price\":\"desc\"}"; 

를 포함하는 String 개체를 만들고 당신은 당신의 getForObject()

과 같이
OutputPage page = restTemplate.getForObject(url1, OutputPage.class, sort); 
를 부를 것이다 당신의 URL

String url1 = "http://api.example.com/Search?key=52ddafbe3ee659bad97fcce7c53592916a6bfd73&term=&limit=100&sort={sort}"; 

을에 실제 URI 변수를 제공하는 것입니다

JSON을 보내지 말 것을 강력히 권한다. 요청 매개 변수의 요청 매개 변수가 아닌 POST 요청의 본문으로 전송하십시오.

2

당신은 인코딩을 매개 변수 값을 올릴 수없는 URL :

String url1 = "http://api.example.com/Search?key=52ddafbe3ee659bad97fcce7c53592916a6bfd73&term=&limit=100&sort="; 

org.apache.commons.codec.net.URLCodec codec = new org.apache.commons.codec.net.URLCodec(); 
url1 = url1 + codec.encode("{\"price\":\"desc\"}"); 
OutputPage page = restTemplate.getForObject(url1, OutputPage.class); 
관련 문제