我试图实现同样的事情:如何使用查询参数表示为JSON与Spring RestTemplate?,发送JSON字符串作为URL参数在restTemplate.exchange()
.
公认的答案提到将JSON对象作为请求参数发送通常不是一个好主意,因为您可能会面临JSON中的花括号问题。这正是当我试图对API进行GET调用时发生的事情。由于这是来自另一个系统的API,我不能要求他们更改格式,必须调用GETendpoint,将JSON作为参数传递。我如何在restTemplate.exchange()
调用中实现这一点?
注意:提到的相关问题并没有指导如何克服这个问题,我也没有足够的声誉来评论它,以询问答案的作者。
您可以使用 URL 编码器
类在交换
方法中对 URL 进行编码,例如:
String url = "http://www.yoursite.com/api?param={\"some_key\":\"some_value\"}";
System.out.println(URLEncoder.encode(url, StandardCharsets.UTF_8.name()));
这将对字符进行编码(如大括号和双引号),然后服务器将其解码回json
。
如果这是第三方API,并且您无法控制或更改后端的JSON处理,则没有解决方案。即使您将使用URLEncoder进行编码,也不能保证API后端会正确处理此类请求。
回答我自己的问题。虽然在query/url参数中像这样传递JSON不是一个好主意,但这里建议了一种解决方法:https://jira.spring.io/browse/SPR-9220?focusedCommentId=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 查询/网址参数的网址作为字符串传递,不如将其作为 URI 传递。然后像以前一样调用交换
方法,但使用 URI 而不是字符串:
restTemplate.exchange(uri, HttpMethod.GET, requestEntity, String.class)
问题内容: 我想在url中发送json数据,如下所示。 我怎样才能做到这一点? 问题答案: URL编码您的详细信息参数:
问题内容: 我需要在Web服务调用中将一些值从移动设备传递到服务器,因此我打算将JSON格式的所有值传递如下 以下是我的服务电话 我正在尝试通过这种方式致电上述服务 但是输出是这样的 谁能告诉我为什么我没有获得所有的价值观? 问题答案: 我建议将JSON数据作为请求传递给主体。但是,如果您仍然希望将其作为URL中的参数传递,则必须像下面这样对URL进行编码,例如: 对于前json是:-> 有关UR
我必须以Json数组的格式发出有效负载的post请求。我使用开放的HTTP URL连接。我有使用url连接发送Json对象作为post参数的代码,但我不知道如何发送json数组。下面显示的是json对象的开放url post请求的代码。有人能帮我发送Json数组而不是json对象吗? 这是我想发布的格式。 如何更改代码以发布json数组。
如何将API中的JSON文件作为android中的参数发送? 就像 我必须在API中发送这个JSON。这里是演示。json是一个文件。
我已经查看了各种答案,但它们并没有解决我的问题。我有一个非常具体的客户需求,我无法使用请求的主体。 我已经检查了这些帖子: 尝试使用Spring Boot REST从POST读取JSON字符串 使用Jackson JSON在Spring MVC中解析JSON 在Rest web方法中传递JSON对象 注意:我确实对URI进行了编码。 我得到各种错误,但非法的超文本标记语言字符是一个。要求很简单:
如何在谷歌VPC项目中运行的谷歌数据流模板中传递/设置“usepublicips”作为运行时参数?