我正在努力实现与此相同的事情:How to use query parameter represented as JSON with Spring RestTemplate?,在restTemplate.exchange()
中将JSON字符串作为URL参数发送。
接受的答案提到将JSON对象作为请求参数发送通常不是一个好主意,因为您可能会遇到JSON中的花括号问题。这正是我尝试对API进行GET调用时发生的事情。由于这是来自另一个系统的API,我不能要求他们更改格式,并且必须调用GET端点,将JSON作为参数传递。如何在restTemplate.exchange()
电话中实现这一目标?
注意:上述相关问题并没有指导如何克服这个问题,而且我没有足够的声誉来评论它,可以向作者询问答案。
答案 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后端能够正确处理此类请求。