Graphql错误请求是由于使用spring-boot RestTemplate转义了qoutes



使用poster对于原始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}}"}" ...

但是在服务器端当我从邮递员调用时,我得到了这个有效负载日志,它运行得很好

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

很明显,我可以看到,当我从java调用时,有效载荷数据被包裹在qoutes中,每个qoute都在其中转义,而来自poster的有效载荷没有被包裹在qouses下,除了过滤器之外,什么都没有转义。使用restTemplate,我到底能做什么解决方案?

我强烈建议使用变量来传递GraphQL文档中显示的查询参数,也建议将失眠作为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主体

我找到了解决方案,基本上我只需要把"查询";作为映射中的键和值中的其他键。在这种情况下,身体不会奇怪地裹在被子里。

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...

最新更新