在 java 中发送 GraphQl 查询

2022-09-02 13:51:17

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

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

下面是查询:

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

答案 1

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

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

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

参数

我在这里找到了一个类似的案例:星球大战.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())

在本例中,只定义了一个参数,即 id。 告诉我们这是一个必需的字符串参数。new GraphQLNonNull(GraphQLString)

领域

对于字段,它在 中定义,您可以参考 StarWarsSchema.java#L61。嵌套字段只是具有某些字段的另一种类型,例如,humanType.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
    }
}

希望这有帮助。


答案 2

首先,确保你可以通过像这样卷曲来获得结果。如果这有效(请确保根据动词服务器的期望将动词更改为GET),那么您所需要做的就是在http请求正文中发送查询部分,内容类型为appplication/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客户端构建查询并发送请求。我已经成功地使用泽西岛客户端做到了这一点。唯一的挑战是构建查询,如果你想有一些通用的查询生成器。但是github上有像这样的查询构建器,您可以根据需要对其进行调整。

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

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

推荐