私はGraphQLを初めて使用します。私はそれが非常に基本的な質問であることを知っています。しかし、多くの時間を費やしてみましたが、それができませんでした。
私の要件は、Javaクラスからのgraphql-Java APIメソッドを使用してGraphQLクエリを送信する必要があることです。
これがクエリです:
{
contentItem(itemId: 74152479) {
slug
updatedAt
contributors {
id
isFreeForm
name
}
}
}
最初に、問題についてさらに説明する必要があります。サンプルクエリからは、実際に問題が発生している部分がわかりません。argument、ネストされたオブジェクト、またはデータフェッチャー
私も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という1つの引数のみが定義されます。 new GraphQLNonNull(GraphQLString)
は、これが必須の文字列引数であることを示します。
フィールドについては、humanType
で定義されているため、 https://github.com/andimarek/graphql-Java/blob/master/src/test/groovy/graphql/StarWarsSchema)を参照できます。 Java#L51 。ネストされたフィールドは、.type(nestedHumanType)
など、いくつかのフィールドを持つもう1つのタイプです
結局のところ、引数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
}
}
_
お役に立てれば。
まず、そのようにカーリングして結果が出せることを確認してください。これが機能する場合(動詞サーバーが期待するものに応じて、動詞を[〜#〜] get [〜#〜]に変更してください)、すべての実行する必要があるのは、content-typeをapplication/jsonとして、httpリクエスト本文でクエリ部分を送信することです。
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本文で送信する必要があるものです。私は彼を1つのライナーに入れました、それはリクエストボディがどのように見えるか正確です。改行などの余分なフォーマットを削除する必要があります。
{ "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 \
-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
あなたは利用することができます
environment.getFieldDefinition().getName().equals(expected_query_name)
これはクエリ名を取得し、クエリを区別できます
JavaでGraphQLリクエストを簡単に実行できるようにするために必要なすべてのコードを生成するgraphql-maven-plugin-projectを確認できます。
https://github.com/graphql-Java-generator/graphql-maven-plugin-project で入手できます。それのウェブサイトは https://graphql-maven-plugin-project.graphql-Java-generator.com です。
エティエンヌ