2014-02-17 1 views
12

Ich versuche, auf den Inhalt einer API zuzugreifen, und ich muss eine URL mithilfe von RestTemplate senden.Verwenden von RestTemplate im Frühling. Ausnahme: Nicht genügend Variablen zum Erweitern verfügbar

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

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

Aber ich erhalte die folgende Fehlermeldung.

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) 

Wenn ich die Sortierkriterien zu entfernen, wird es richtig funktioniert. Ich muss den JSON mithilfe von Sortierkriterien analysieren. Jede Hilfe wird sehr geschätzt.

Dank

Antwort

34

Die Ursache ist, dass RestTemplate geschweiften Klammern {...} in der angegebenen URL als Platzhalter für URI Variablen und versucht, sie anhand ihrer Namen zu ersetzen, hält. Zum Beispiel

{pageSize} 

würde versuchen, eine URI Variable pageSize genannt zu bekommen. Diese URI-Variablen werden mit einigen der anderen überladenen getForObject-Methoden angegeben. Sie haben keine angegeben, aber Ihre URL erwartet eine, sodass die Methode eine Ausnahme auslöst.

Eine Lösung ist ein String Objekt enthält den Wert

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

und bieten eine echte URI Variable in der URL

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

Sie würden rufen Sie Ihren getForObject() wie so

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

Ich schlage vor, dass Sie keine JSON in einem senden Request-Parameter einer GET-Anfrage, sondern senden Sie es im Körper einer POST-Anfrage.

2

Sie können die Parameterwerte URL kodieren:

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