Using RestTemplate in Spring. Exception- Not enough variables available to expand

匿名 (未验证) 提交于 2019-12-03 01:12:01

问题:

I am trying to access the contents of an API and I need to send a URL using RestTemplate.

String url1 = "http://api.example.com/Search?key=52ddafbe3ee659bad97fcce7c53592916a6bfd73&term=&limit=100&sort={\"price\":\"desc\"}";  OutputPage page = restTemplate.getForObject(url1, OutputPage .class); 

But, I am getting the following error.

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) 

If I remove the sort criteria, it is working properly. I need to parse the JSON using sort criteria. Any help will be much appreciated.

Thanks

回答1:

The root cause is that RestTemplate considers curly braces {...} in the given URL as a placeholder for URI variables and tries to replace them based on their name. For example

{pageSize} 

would try to get a URI variable called pageSize. These URI variables are specified with some of the other overloaded getForObject methods. You haven't provided any, but your URL expects one, so the method throws an exception.

One solution is to make a String object containing the value

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

and provide a real URI variable in your URL

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

You would call your getForObject() like so

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

I strongly suggest you do not send any JSON in a request parameter of a GET request but rather send it in the body of a POST request.



回答2:

You can URL encode the parameter values:

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


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!