19

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

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

这是查询:

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

3 回答 3

7

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

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

graphql-java实际上在他们的测试用例中做得很好。您可以参考此处:src/test/groovy/graphql以获取有关如何创建和查询 GraphQL 模式的一些想法。

论据

我在这里发现了一个类似的案例:StarWarsSchema.java#L137

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,您可以参考StarWarsSchema.java#L61。嵌套字段只是具有某些字段的另一种类型,例如,.type(nestedHumanType)

数据提取器

毕竟,您可能会处理参数id并返回一些数据。你可以参考这里的例子:StarWarsData.groovy#L89

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

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

希望这可以帮助。

于 2016-05-04T07:20:48.787 回答
3

首先,确保你可以像这样卷曲得到结果。如果这有效(确保根据动词服务器的期望将动词更改为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 } } }" }
于 2019-12-05T23:49:36.740 回答
2

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

普遍进行 GraphQL 查询的过程是:

  1. 使用变量重写查询

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

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

    • header:设置content-typeapplication/json

    • 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
于 2020-02-02T11:42:37.237 回答