web-dev-qa-db-ja.com

javaでGraphQlクエリを送信する

私はGraphQLを初めて使用します。私はそれが非常に基本的な質問であることを知っています。しかし、多くの時間を費やしてみましたが、それができませんでした。

私の要件は、Javaクラスからのgraphql-Java APIメソッドを使用してGraphQLクエリを送信する必要があることです。

これがクエリです:

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

最初に、問題についてさらに説明する必要があります。サンプルクエリからは、実際に問題が発生している部分がわかりません。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
    }
}
_

お役に立てれば。

7
ch33hau

まず、そのようにカーリングして結果が出せることを確認してください。これが機能する場合(動詞サーバーが期待するものに応じて、動詞を[〜#〜] 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 } } }" }
1
yantaq

vertx-graphql-client に実装されているソリューションがあります。

GraphQLクエリを普遍的に作成するプロセスは次のとおりです。

  1. 変数を使用してクエリを書き換える

したがって、クエリは次のようになります。

query contentItem($itemId: Int){
  contentItem(itemId: $itemId) {
    slug
    updatedAt
    contributors {
      id
      isFreeForm
      name
    }
  }
}
  1. HTTP経由でクエリを送信POSTリクエスト

    • header:セットcontent-typeapplication/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
1
anhldbk

あなたは利用することができます

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

これはクエリ名を取得し、クエリを区別できます

0
saif ali

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 です。

エティエンヌ

0
etienne_sf