我是 GraphQL 的新手。我知道这是非常基本的问题。但是尝试花费大量时间,我无法做到。
我的要求是我需要使用 java 类中的 graphql-java api 方法发送 GraphQL 查询。
这是查询:
{
contentItem(itemId: 74152479) {
slug
updatedAt
contributors {
id
isFreeForm
name
}
}
}
我是 GraphQL 的新手。我知道这是非常基本的问题。但是尝试花费大量时间,我无法做到。
我的要求是我需要使用 java 类中的 graphql-java api 方法发送 GraphQL 查询。
这是查询:
{
contentItem(itemId: 74152479) {
slug
updatedAt
contributors {
id
isFreeForm
name
}
}
}
首先,您必须更多地说明您的问题,从您的示例查询中我实际上无法看到您遇到问题的部分,它可能在参数、嵌套对象或数据提取器中
我也是 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())
在这种情况下,只定义了一个参数,即id。new 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
}
}
希望这可以帮助。
首先,确保你可以像这样卷曲得到结果。如果这有效(确保根据动词服务器的期望将动词更改为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 } } }" }
我有一个在vertx-graphql-client中实现的解决方案。
普遍进行 GraphQL 查询的过程是:
所以您的查询可能如下所示:
query contentItem($itemId: Int){
contentItem(itemId: $itemId) {
slug
updatedAt
contributors {
id
isFreeForm
name
}
}
}
通过 HTTP POST 请求发送您的查询
header
:设置content-type
为application/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