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}}\"}" ...
但是在服务器端,当我从邮递员[=36=]调用时,我得到这个有效负载日志 效果很好
... 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...
使用 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}}\"}" ...
但是在服务器端,当我从邮递员[=36=]调用时,我得到这个有效负载日志 效果很好
... 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...