在java中发送GraphQl查询

时间:2016-04-28 12:36:50

标签: java graphql graphql-java

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

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

以下是查询:

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

5 个答案:

答案 0 :(得分:7)

首先,您必须更详细地说明您的问题,从您的示例查询中我实际上无法确定您遇到问题的哪个部分,它可能位于参数嵌套对象数据提取程序

我也是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())

在这种情况下,只定义了一个参数,即 id new 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
    }
}

希望这有帮助。

答案 1 :(得分:2)

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

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

  1. 使用变量重写查询

因此您的查询可能类似于:

public function compose(View $view)
{
    $view->with(['latestCommentedPost' =>
       $this->post->select(['posts.title', 'posts.slug'])
        ->leftjoin('commentable', function($join) {
            $join->on('commentable.commentable_id', '=', 'posts.id')
                 ->where('commentable.commentable_type', 'App\Post')
                 ->latest()->limit(1);
        })->latest('commentable.created_at')
        ->take(6)
        ->with(['comments' => function($q){
            return $q->latest()->take(6)->get();
        }])->get()
    ]);
}
  1. 使用

    通过HTTP POST请求发送查询
    • query contentItem($itemId: Int){ contentItem(itemId: $itemId) { slug updatedAt contributors { id isFreeForm name } } } :将header设置为content-type

    • application/json:主体是通过序列化以下JSON数据来设置的:

body

通过卷曲,很容易做到:

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

答案 2 :(得分:0)

您可以使用

environment.getFieldDefinition().getName().equals(expected_query_name)

这将获取查询名称,您可以区分查询

答案 3 :(得分:0)

您可以检查graphql-maven-plugin-project,该项目会生成所有必需的代码,以简化在Java中执行GraphQL请求的过程。

它在https://github.com/graphql-java-generator/graphql-maven-plugin-project上可用。 它的网站是https://graphql-maven-plugin-project.graphql-java-generator.com

艾蒂安

答案 4 :(得分:0)

首先,请确保通过卷曲来获得结果。如果可行(确保根据动词服务器的期望将动词更改为 GET ),然后 您需要做的就是将HTTP请求正文中的查询部分发送为content-type作为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 } } }" }