如何使用Spring RestTemplate表示为JSON的查询参数?
我需要使用Spring RestTemplate向具有表示为JSON的查询参数的HTTP端点发出请求。
restTemplate.getForObject( apiRoot + "/path" + "?object={myObject}", Response.class, new MyObject())
在这里,我需要将MyObject
转换为JSON(显然是URL编码)。 但RestTemplate
只是将其转换为带有toString
调用的String
。 MyObject
可由Jackson转换为JSON。 UriComponentsBuilder
行为方式相同:
UriComponentsBuilder.fromHttpUrl(apiRoot) .path("/path") .queryParam("object", new MyObject())) .queryParam("access_token", accessToken) .toUri()
有没有办法避免手工调用ObjectMapper.writeValueAsString
?
更新:澄清一下,在结果中我需要在我的URI中使用?object={"key":42}
(或者在URL编码forms?object=%7B%22key%22%3A42%7D
),因为MyObject
有一个属性key
,值等于42
。
使用writeValueAsString
什么问题? 你可以解释吗?
我想到的唯一解决方案就是(我不认为jackson是否有办法知道这个对象应该在那一刻被序列化):
@Autowired ObjectMapper objectMapper; @Override public void run(String... strings) throws Exception { String urlBase = "http://localhost:8080/path"; RestTemplate restTemplate = new RestTemplate(); String url; MultiValueMap params = new LinkedMultiValueMap(); params.set("object", objectMapper.writeValueAsString(new MyObject())); UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(urlBase).queryParams(params); url = builder.build().toUri().toString(); LOGGER.info("Composed before decode: " + url); //restTemplate.getForObject(url, Void.class); url = URLDecoder.decode(url, "UTF-8"); LOGGER.info("Composed after decode: " + url); }
输出:
2016-04-05 16:06:46.811 INFO 6728 --- [main] com.patrykwoj.StackOverfloApplication : Composed before decode: http://localhost:8080/path?object=%7B%22key%22:43%7D 2016-04-05 16:06:46.941 INFO 6728 --- [main] com.patrykwoj.StackOverfloApplication : Composed after decode: http://localhost:8080/path?object={"key":43}
编辑:
我忘了提到,将JSON对象作为请求参数发送通常不是一个好主意。 例如,您可能会遇到JSON中的大括号问题。
- 尽管使用了JsonIgnore,但未能懒惰地初始化ManyToMany关系中的角色集合
- 与JS.fasterxml.jackson JacksonJaxbJsonProvider的@XMLElementWrapper问题
- jackson – 反序列化失败了循环依赖
- 无法使用(de)序列化具有Jackson中多态项的List
- XMLWriter使用zdef扩展属性名称?
- jackson没有逃脱JSON中的引用
- Jackson的动态多态类型处理
- 如何使用Jackson重命名JSON序列化中的根密钥
- Java Jackson:反序列化复杂的多态对象模型:JsonMappingException:意外的令牌(START_OBJECT),预期的VALUE_STRING