如何使用Spring RestTemplate在URL中将JSON作为参数发送?

时间:2017-04-06 10:37:24

标签: java json spring resttemplate

我正在努力实现与此相同的事情:How to use query parameter represented as JSON with Spring RestTemplate?,在restTemplate.exchange()中将JSON字符串作为URL参数发送。

接受的答案提到将JSON对象作为请求参数发送通常不是一个好主意,因为您可能会遇到JSON中的花括号问题。这正是我尝试对API进行GET调用时发生的事情。由于这是来自另一个系统的API,我不能要求他们更改格式,并且必须调用GET端点,将JSON作为参数传递。如何在restTemplate.exchange()电话中实现这一目标?

注意:上述相关问题并没有指导如何克服这个问题,而且我没有足够的声誉来评论它,可以向作者询问答案。

3 个答案:

答案 0 :(得分:8)

回答我自己的问题。虽然在query / url参数中传递这样的JSON是个坏主意,但是这里有一个解决方法:https://jira.spring.io/browse/SPR-9220?focusedCommentId=76760&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-76760
如果此链接失效,请复制代码:

String url = "http://localhost:8983/solr/select?wt=json&indent=true&fl=*&q=*:*&fq={!geofilt}&sfield=venue_location&pt=28.0674,-80.5595&d=25";
URI uri = UriComponentsBuilder.fromUriString(url).build().encode().toUri();

System.out.println(uri);
// http://localhost:8983/solr/select?wt=json&indent=true&fl=*&q=*:*&fq=%7B!geofilt%7D&sfield=venue_location&pt=28.0674,-80.5595&d=25

基本上,不是将带有JSON查询/ url参数的url作为字符串传递,而是将其作为URI传递。然后像以前一样调用exchange方法,但使用URI而不是String:

restTemplate.exchange(uri, HttpMethod.GET, requestEntity, String.class)

答案 1 :(得分:0)

您可以使用URLEncoder类以exchange方式对网址进行编码,例如:

String url = "http://www.yoursite.com/api?param={\"some_key\":\"some_value\"}";
System.out.println(URLEncoder.encode(url, StandardCharsets.UTF_8.name()));

这将对字符(如大括号和双引号)进行编码,然后服务器将其解码回json

答案 2 :(得分:0)

如果这是第三方API而您无法在后端控制或更改JSON处理 - 则没有解决方案。即使您使用URLEncoder进行编码 - 也无法保证API后端能够正确处理此类请求。