我是GraphQL的新手。我知道这是非常基本的问题。但是我花了很多时间尝试,但我无法做到。
我的要求是我需要使用java类中的graphql-java api方法发送GraphQL查询。
以下是查询:
{
contentItem(itemId: 74152479) {
slug
updatedAt
contributors {
id
isFreeForm
name
}
}
}
答案 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查询的过程是:
因此您的查询可能类似于:
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()
]);
}
使用
通过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 } } }" }