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

use*_*407 3 java spring json resttemplate

我试图实现与此相同的事情:如何使用Spring RestTemplate表示为JSON的查询参数?,将JSON字符串作为URL参数发送restTemplate.exchange().

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

注意:提到的相关问题没有指导如何克服这个问题,我没有足够的声誉来评论它,以询问作者的答案.

use*_*407 10

回答我自己的问题.虽然在query/url参数中传递这样的JSON是个坏主意,但是这里有一个解决方法:https://jira.spring.io/browse/SPR-9220?focusCommentId = 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
Run Code Online (Sandbox Code Playgroud)

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

restTemplate.exchange(uri, HttpMethod.GET, requestEntity, String.class)
Run Code Online (Sandbox Code Playgroud)

  • 感谢您的解决方案,传递URI就像一个魅力!在我的例子中,我需要传递一些参数:`UriComponentsBuilder builder = UriComponentsBuilder.fromUriString(url); URI uri = builder.build().expand(params).encode().toUri(); restTemplate.getForObject(uri,String.class);` (2认同)