Graphql 错误请求由于转义 qoutes 使用 spring 启动 RestTemplate

Graphql bad request due escaped qoutes using spring boot RestTemplate

使用 postman 一切都是 fine 原始 JSON 内容类型。

{"query":"{getX(filter: \"X\", filter2: \"Y\") {data1, data2, data3} }

在 java 客户端 中调用时,出现 400 错误

String body = "{\"query\":\"{getX(filter: \\"X\\", filter2: \\"Y\\") {data1, data2, data3}}\"}"; 
// simply copied from postman to Intellij and it did some escaping for me
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity httpEntity = new HttpEntity<>(body, headers);
ResponseEntity<List<SomeObject>> response = restTemplate.exchange(uri, POST, httpEntity, new ParameterizedTypeReference<List<SomeObject>>(){});

服务器端我可以看到我收到错误:

JSON parse error: Cannot construct instance of 'java.util.LinkedHashMap': no String-argument constructor/factory method to deserialize from String value ....
//Looks like server thinks I passed one big string
... payload="{\"query\":\"{getX(filter: \\"X\\", filter2: \\"Y\\") {data1, data2, data3}}\"}" ...

但是在服务器端,当我从邮递员[=3​​6=]调用时,我得到这个有效负载日志 效果很好

... payload={"query":"{getX(filter: \"X\", filter2: \"Y\") {data1, data2, data3}}"} ...

显然我可以看到,当我从 java 调用时,有效负载数据 包裹在 qoutes 和每个 qoute 中在其中进行了转义,同时来自邮递员的有效负载未包含在 qoutes 下,并且除了过滤器之外没有任何内容被转义。使用 restTemplate?

我究竟可以做什么解决方案

我强烈建议使用变量来传递查询参数,如 GraphQL docs, and also will recommend insomnia 中所示,作为 GraphQL 查询的客户端,因为它支持具有良好 ui 表示的 GraphQL,下面可能是您的要求有变量

{
   "query":"query($filter_1: string, $filter_2 : string){getX(filter: $filter_1, filter2: $filter_2) {data1, data2, data3} }",
   "variables" : {"filter_1":"X", "filter_2": "Y"}
}

您必须在请求

中传递上述所有负载广告POST正文

我找到了解决方案,基本上我所需要的只是将“查询”作为映射中的键和其他值中的键。在这种情况下 body 不会奇怪地包裹在 qoutes 中。

Map<String, String> body = of("query", "{getX(filter: \"X\", filter2: \"Y\") {data1, data2, data3}}");
HttpEntity httpEntity = new HttpEntity<>(body, headers);
//and pass it to restTemplate...