在 Java 中处理 GraphQl 响应的最佳方法是啥

Posted

技术标签:

【中文标题】在 Java 中处理 GraphQl 响应的最佳方法是啥【英文标题】:What is the best way to handle GraphQl response in Java在 Java 中处理 GraphQl 响应的最佳方法是什么 【发布时间】:2019-10-25 20:54:35 【问题描述】:

在使用 Java 6 的遗留应用程序中,我正在使用 Spring RestTemplate 调用 GraphQl API,现在我想知道处理响应的最佳方法是什么,一旦 GraphQl 总是会在成功的情况下给出 StatusCode 200 的响应或错误,不同之处在于在正文响应中会有一个字符串,其中“数据”表示成功,“错误”表示错误。 我在想我可以获得响应并转换为字符串并使用“包含”检查并检查响应正文中是否存在“数据”或“错误”,但我不知道这是否是最好的方法。 下面的代码是 Java 应用程序调用 GraphQl API 的方式:

ResponseEntity<?> response = restTemplate.exchange(url, HttpMethod.POST, httpEntity, String.class);

我想到的处理方式是:

if (response.getBody().toString().contains("errors"))
    handleException

【问题讨论】:

handleException 将是:返回新的 ResponseEntity(T body, MultiValueMap headers, HttpStatus status) Tks TechFree,但我怀疑我是否应该使用这个条件“response.getBody().toString().contains(“errors”)”来检查是否有错误或有另一个更好的方法。 显然,您不应该那样做。我同意@Ken_Chan 的回答。 【参考方案1】:

GraphQL 将以以下JSON 格式给出响应正文


  "data":  ... ,
  "errors": [ ... ]

如果有错误,它将有一个错误字段。

所以,当您检查整个 JSON 响应是否包含 errors 字符串而不是 errors 字段时,这是一个坏主意。它肯定会因为 data 包含 errors 字符串而失败(例如认为这是一个获取用户请求,但用户使用 errors 作为他的登录 ID)

您应该将响应正文解析为 JSON 对象,并检查 JSON 是否包含名为 errors 的字段。

如果您在类路径中有JacksonRestTemplate 将检测到它并自动配置自己以能够解析 JSON,这允许您执行以下操作:

ResponseEntity<Map<String,Object>> response = restTemplate.exchange(url, HttpMethod.POST, httpEntity, Map.class);
Map<String,Object> body = response.getBody();
if(body.containsKey("errors"))
   //handleException

【讨论】:

以上是关于在 Java 中处理 GraphQl 响应的最佳方法是啥的主要内容,如果未能解决你的问题,请参考以下文章

如何在 GraphQL 中处理错误并发送响应

使用graphql-java-tools和graphql-spring-boot-starter处理错误。

GraphQL 部分更新响应类型

如何在 GraphQl 和 Neo4js 中处理响应

如何自定义 Java GraphQL 错误响应

graphql-java 中的模拟 api 响应