2016-11-27 4 views
0

Предположим, мне нужно использовать RestTemplate для запроса GET, когда URL содержит действительный JSON. Пример URL является:Обращение с шаблоном шаблона RestTemplate, когда URL содержит JSON

http://example.com/?json={"property1":{"property2":0},"property3":{"property4":0.0,"property5":0.0}} 

Код:

String url = "http://example.com/?json={\"property1\":{\"property2\":0},\"property3\":{\"property4\":0.0,\"property5\":0.0}}"; 
RestTemplate template = new RestTemplate(); 
ResponseEntity<String> response = template.getForEntity(url, String.class); 

Исключение:

Exception in thread "main" java.util.regex.PatternSyntaxException: Illegal repetition near index 32 
\Qhttp://example.com/?json=\E({"property2":0)\Q,"property3":\E(0.0,"property5":0.0)\Q}\E 
          ^
at java.util.regex.Pattern.error(Pattern.java:1955) 
at java.util.regex.Pattern.closure(Pattern.java:3157) 
at java.util.regex.Pattern.sequence(Pattern.java:2134) 
at java.util.regex.Pattern.expr(Pattern.java:1996) 
at java.util.regex.Pattern.group0(Pattern.java:2905) 
at java.util.regex.Pattern.sequence(Pattern.java:2051) 
at java.util.regex.Pattern.expr(Pattern.java:1996) 
at java.util.regex.Pattern.compile(Pattern.java:1696) 
at java.util.regex.Pattern.<init>(Pattern.java:1351) 
at java.util.regex.Pattern.compile(Pattern.java:1028) 
at org.springframework.web.util.UriTemplate$Parser.getMatchPattern(UriTemplate.java:247) 
at org.springframework.web.util.UriTemplate$Parser.access$200(UriTemplate.java:196) 
at org.springframework.web.util.UriTemplate.<init>(UriTemplate.java:70) 
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:471) 
at org.springframework.web.client.RestTemplate.getForEntity(RestTemplate.java:260) 

RestTemplate цитирует URL до начала JSON, а не весь URL , Из экспериментов я знаю, что фигурные скобки являются проблемой. Однако избежать их с помощью обратного слэша не решает проблему. Следующий код создает "незамкнутую группу" исключение:

String url = "http://example.com/?json=\\{\"property1\":\\{\"property2\":0\\}\\}"; 
RestTemplate template = new RestTemplate(); 
ResponseEntity<String> response = template.getForEntity(url, String.class); 

Исключение:

Exception in thread "main" java.util.regex.PatternSyntaxException: Unclosed group near index 56 
\Qhttp://example.com/?json=\\E(\{"property2":0\)\Q\}\E 
                ^
at java.util.regex.Pattern.error(Pattern.java:1955) 
at java.util.regex.Pattern.accept(Pattern.java:1813) 
at java.util.regex.Pattern.group0(Pattern.java:2908) 
at java.util.regex.Pattern.sequence(Pattern.java:2051) 
at java.util.regex.Pattern.expr(Pattern.java:1996) 
at java.util.regex.Pattern.compile(Pattern.java:1696) 
at java.util.regex.Pattern.<init>(Pattern.java:1351) 
at java.util.regex.Pattern.compile(Pattern.java:1028) 
at org.springframework.web.util.UriTemplate$Parser.getMatchPattern(UriTemplate.java:247) 
at org.springframework.web.util.UriTemplate$Parser.access$200(UriTemplate.java:196) 
at org.springframework.web.util.UriTemplate.<init>(UriTemplate.java:70) 
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:471) 
at org.springframework.web.client.RestTemplate.getForEntity(RestTemplate.java:260) 
at com.ebay.sdo.misc.ThemisTest.main(ThemisTest.java:55) 

Как я могу сделать RestTemplate процитировать URL правильно?

+0

почему вам нужно включить 'json' в URL, если это' запрос GET'? – NiVeR

+0

К сожалению, именно так разработан API ... – Ozilophile

+0

Как указал Дэвид С., кодирование URL является ключевым. тем не менее, задайте вопрос о дизайне API. Также обратите внимание, что браузеры/серверы имеют ограничение символов. Тело запроса с методом POST будет иметь больший смысл – Hirako

ответ

1

вы пытаетесь передать строку JSON прямо в URL-адрес, нарушая кодировку url. Вы должны кодировать свою полезную нагрузку JSON, прежде чем использовать ее в resttemplate.

См этот вопрос, чтобы узнать несколько способов, как UrlEncode:

spring resttemplate url encoding

 Смежные вопросы

  • Нет связанных вопросов^_^