【问题标题】:Sending GraphQl query in java在 java 中发送 GraphQl 查询
【发布时间】:2016-08-23 05:34:50
【问题描述】:

我是 GraphQL 的新手。我知道这是非常基本的问题。但是尝试了花费很多时间,但我无法做到。

我的要求是我需要使用 java 类中的 graphql-java api 方法发送 GraphQL 查询。

这是查询:

{
  contentItem(itemId: 74152479) {
    slug
    updatedAt
    contributors {
      id
      isFreeForm
      name
    }
  }
}

【问题讨论】:

  • 您能否发送查询。如果可以,请提供用于在 java 中发送 graphql 查询的代码。它可以帮助快速访问此问题的访问者
  • graphql-java 用于 GraphQL 服务器开发,而不是用于发送查询的客户端

标签: java graphql graphql-java


【解决方案1】:

首先,您必须更多地说明您的问题,从您的示例查询中我实际上无法看到您遇到问题的部分,它可能在 argumentnested object,或数据提取器

我也是 GraphQL(java) 的新手,我没有与您分享直接答案,而是想向您展示我是如何解决类似问题的。

graphql-java 实际上在他们的测试用例中做得很好。您可以参考这里:https://github.com/andimarek/graphql-java/tree/master/src/test/groovy/graphql 以获取有关如何创建和查询 GraphQL 架构的一些想法。

参数

我在这里发现了一个类似的案例: https://github.com/andimarek/graphql-java/blob/master/src/test/groovy/graphql/StarWarsSchema.java#L131

newFieldDefinition()
    .name("human")
    .type(humanType)
    .argument(newArgument()
        .name("id")
        .description("id of the human")
        .type(new GraphQLNonNull(GraphQLString))
        .build())
    .dataFetcher(StarWarsData.getHumanDataFetcher())
    .build())

在这种情况下,只定义了一个参数,即idnew GraphQLNonNull(GraphQLString) 告诉我们这是一个强制性的字符串参数。

字段

字段定义在humanType,可以参考https://github.com/andimarek/graphql-java/blob/master/src/test/groovy/graphql/StarWarsSchema.java#L51。 嵌套字段只是另一种带有一些字段的类型,例如.type(nestedHumanType)

数据提取器

毕竟,您可能会处理参数 id 并返回一些数据。 你可以参考这里的例子:https://github.com/andimarek/graphql-java/blob/master/src/test/groovy/graphql/StarWarsData.groovy#L84

为了让我的代码看起来更干净,通常我会为 DataFetcher 创建一个单独的类,例如:

public class HumanDataFetcher implements DataFetcher {
    @Override
    public Object get(DataFetchingEnvironment environment) {
        String id = (String)environment.get("id");
        // Your code here
    }
}

希望这会有所帮助。

【讨论】:

  • 你能帮帮我吗?我需要一个像这样的突变查询{ Author(id:2,name:"ajmal",posts:[{id:1,title:"hello"}]){ id } }
  • 这是一个非常模糊的问题。但是,答案准确描述了您应该如何执行此查询。首先从构建模型开始,在其中定义所有字段及其类型。然后@OverrideDataFetcher接口中的get()方法,这个方法应该返回任何你想返回给用户的数据。 DataFetchingEnvironment 参数本质上包含用户突变提供的所有字段,只要它们在您的模型中定义即可。
  • 问题是关于查询 GraphQL 服务器,而不是关于开发一个。
  • 答案中提供的链接不再有效。
【解决方案2】:

首先,确保你可以像这样卷曲得到结果。如果这有效(确保根据动词服务器的预期将动词更改为 GET)然后 您需要做的就是在 http 请求正文中发送查询部分,内容类型为 application/json。

curl \
    -X POST \
    -H "Content-Type: application/json" \
    --data '{ "query": "{ contentItem(itemId: \"74152479\") { slug updatedAt    contributors { id isFreeForm name } } }" }' \
    http://www.yoursite.com/your/graphql/api

一旦成功,您就可以使用 Java http 客户端构建查询并发送请求。我已经使用 Jersey 客户端成功地做到了这一点。如果您想拥有一些通用查询构建器,唯一的挑战是构建查询。但是 github 上有类似 ONE 的查询生成器,您可以对其进行调整以满足您的需求。

总而言之,以下是您需要在 http 正文中发送的内容。我把他放在一个衬里,这正是请求正文的样子。您必须删除任何额外的格式,如换行等。

{ "query": "{ contentItem(itemId: \"74152479\") { slug updatedAt    contributors { id isFreeForm name } } }" }

【讨论】:

    【解决方案3】:

    我有一个在vertx-graphql-client 中实施的解决方案。

    通用进行 GraphQL 查询的过程是:

    1. 使用变量重写查询

    所以您的查询可能如下所示:

    query contentItem($itemId: Int){
      contentItem(itemId: $itemId) {
        slug
        updatedAt
        contributors {
          id
          isFreeForm
          name
        }
      }
    }
    
    1. 通过 HTTP POST 请求发送您的查询

      • header:将content-type设置为application/json

      • body:body 是通过序列化以下 JSON 数据来设置的:

    {
        "query": "the-templated-query-above",
        "operationName": "contentItem",
        "variables": {
            "itemId": 74152479
        }
    }
    

    使用 curl,很简单:

    curl \
        -X POST \
        -H "Content-Type: application/json" \
        --data '{ "query": "the-templated-query-above", "operationName": "contentItem", "variables": {  "itemId": 74152479 }}' \
        http://www.yoursite.com/your/graphql/api
    

    【讨论】:

      猜你喜欢
      • 2017-10-29
      • 1970-01-01
      • 2021-12-24
      • 2018-08-04
      • 2023-04-05
      • 2018-08-07
      • 2020-06-03
      • 2018-10-18
      • 2016-05-04
      相关资源
      最近更新 更多