如何在不转义双引号的情况下使用 RestTemplate 发送 JSON 发布请求?
Posted
技术标签:
【中文标题】如何在不转义双引号的情况下使用 RestTemplate 发送 JSON 发布请求?【英文标题】:How to send a JSON post request with RestTemplate without escaping double quotes? 【发布时间】:2021-11-30 10:34:39 【问题描述】:我目前正在尝试向外部 API 发送请求。我需要准备一个带有包含报告列表的 JSON 正文的 POST 请求,并使用 RestTemplate 发送它。这是我的代码:
//reportsJson is a list of Report objects containing some data
String postBody;
try
postBody = objectMapper.copy()
.setPropertyNamingStrategy(PropertyNamingStrategy.UPPER_CAMEL_CASE)
.writeValueAsString(reportsJson);
catch (JsonProcessingException e)
log.error("Failed to serialize report.", e);
throw new IllegalArgumentException(e);
var headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.setBearerAuth(getToken());
HttpEntity<?> entity = new HttpEntity<Object>(postBody, headers);
var response = restTemplate.exchange(API_URL, HttpMethod.POST, entity, ReportResponse.class);
不幸的是,我从服务器得到的响应是 HTTP 400 Bad Request:
'[...,...,...]' is not of type 'object'
编辑: 我注意到问题与 RestTemplate 中 JSON 中双引号的转义有关,例如:
\"id\" : \"name\" : \"xyz\" ...
【问题讨论】:
【参考方案1】:单引号不是您的 json 字符串的一部分;它们被放在那里作为呈现错误消息的一部分。
另外,错误信息是正确的:你的 json 不是一个对象,而是一个(对象的)数组。
检查您正在调用的服务的 API 规范,看看列表是否应该是包装对象的 tan 属性,例如:
"data” : [<your objects>]
将 json 有效负载作为对象而不是数组被认为是最佳实践。
【讨论】:
我能够使用 POSTMAN 发送一个成功的 POST 请求,使用完全相同的 JSON,作为一个数组 我的意思是直接数组,不用属性包裹到对象上 @Peters_ 将您的有效负载打印到控制台,将其复制并粘贴到邮递员中,看看会发生什么。 是的,这就是我所做的。它使用邮递员工作 一个合乎逻辑的解释是您从代码中调用的 URL 与从邮递员调用的 URL 不同以上是关于如何在不转义双引号的情况下使用 RestTemplate 发送 JSON 发布请求?的主要内容,如果未能解决你的问题,请参考以下文章