【问题标题】:Handling RestTemplate's pattern matching when URL contains JSON当 URL 包含 JSON 时处理 RestTemplate 的模式匹配
【发布时间】:2016-11-27 12:58:04
【问题描述】:

假设当 URL 包含有效的 JSON 时,我需要对 GET 请求使用 RestTemplate。一个示例网址是:

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?

【问题讨论】:

  • 如果是GET请求,为什么还要在url中加入json
  • 很遗憾,API 就是这样设计的……
  • 正如 David S. 指出的那样,URL 编码是关键。但是,质疑 API 设计。另请注意,浏览器/服务器确实有字符限制。带有 POST 方法的请求正文会更有意义

标签: java json resttemplate


【解决方案1】:

您试图在 URL 中直接传递 JSON 字符串,从而破坏了 url 编码。在 resttemplate 中使用之前,您应该对 JSON 有效负载进行 url 编码。

参考这个问题,了解如何进行 urlencode 的几种方法:

spring resttemplate url encoding

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-04
    • 1970-01-01
    • 2012-09-04
    • 2021-04-14
    • 2019-12-13
    • 1970-01-01
    • 2011-12-21
    • 1970-01-01
    相关资源
    最近更新 更多