背景
Reactのオープンソースにより、Facebookは多くの関連プロジェクトを調達したことを連続して開設しました。これらのプロジェクトは長年にわたって使用されてきました。私の注意を引いたのは、今回はGraphQLであるということでした。現在、公式WebサイトのNodeJSバージョンのみがあります。多くの企業のバックエンドテクノロジースタックはJavaであるため、Githubで見つけることができるGraphQLのJavaバージョンの実装があります。これ以上苦労せずに、コードを見てください。特定の紹介については、公式ウェブサイトCafeにアクセスしてください。そうでなければ、話題から外れます。
graphqlschema
スキーマはデータベースに相当し、多くのGraphQlFieldDefinitionsで構成され、フィールドはデータベーステーブル/ビューと同等であり、各テーブル/ビューは名前、クエリパラメーター、データ構造、およびデータで構成されています。
1)最初にデータ構造(GraphQLOutputType)フィールドを定義し、初期化方法を定義します
private graphqloutputtype usertype; private void initoutputtype(){ / ***メンバーオブジェクト構造* / usertype = newObject().name( "user").field(newfieldDefinition()。name( "id")。 .field(newfielddefinition()。name( "age")。型(graphqlint).build())。field(newfielddefinition()。name( "name")。type(graphqlstring).build()).field(newfielddefinition()。2)名前、クエリパラメーター、データ構造、およびデータ取得を含む、さらに2つの表/ビューを定義します
/ *** QUERYシングルユーザー情報* @return*/ private graphqlfielddefinition createUserfield(){return graphqlfielddefinition.newfielddefinition().name( "user").argument()。name( "id")。タイプ(graphqlint)。クエリパラメーター= "ID") )) 。建てる(); } / ***クエリ複数のメンバー情報* @return* / private graphqlfielddefinition createUserfield(){return graphqlfielddefinition.newfielddefinition().name( "users").Argument()。 .argument(newargument()。name( "size")。type(graphqlint).build()).argument(newargument()。name( "name")。type(graphqlstring).build()).type(new graphqllist(usertype)).datafether(環境 -> environment.getArgument("page"); int size = environment.getArgument("size"); String name = environment.getArgument("name"); // Execute the query, here you can use some test data to illustrate the problem List<User> list = new ArrayList<>(size); for (int i = 0; i < size; i++) { User user = new User(); user.setId(i); user.setAge(i + 15)setsex(i%2) + "_" + i); }3)次に、スキーマを定義して初期化すると、名前が含まれ、1つ以上のテーブル/ビュー(フィールド)が含まれています
プライベートGraphQlschemaスキーマ。 public graphschema(){initOutputType(); schema = graphqlschema.newschema()。query(newobject().name( "graphquery").field(createUsielfield()).field(createUserfield()).build())。build(); }4)上記の手順を完了した後、クラス名に制限なしでモデルを定義する必要がありますが、構造は上記のデータ構造を満たす必要があり、公開する必要があります。
パブリッククラスユーザー{private int id;プライベートインクエイジ;プライベートイントセックス;プライベート文字列名;プライベート文字列の写真; // getter、setter ...}5)次に、それをテストする主な方法を記述します
public static void main(string [] args){graphqlschema schema = new graphschema()。getschema(); string query1 = "{users(page:2、size:5、name:/" john/"){id、sex、name、pic}}"; string query2 = "{user(id:6){id、sex、name、pic}}"; string query3 = "{user(id:6){id、sex、name、pic}、users(page:2、size:5、name:/" john/"){id、sex、name、pic}}"; map <string、object> result1 =(map <string、object>)new graphql(schema).execute(query1).getData(); map <string、object> result2 =(map <string、object>)new graphql(schema).execute(query2).getData(); map <string、object> result3 =(map <string、object>)new graphql(schema).execute(query3).getData(); //ユーザーリストsystem.out.println(result1); //単一のユーザーSystem.out.println(result2)を照会します。 // system.out.println(result3);}を確認する出力:
{users = [{id = 0、sex = 0、name = john_2_0、pic = pic_0.jpg}、{id = 1、sex = 1、name = john_2_1、pic = pic_1.jpg}、{id = 2、sex = 0、name = john_2_2、pic = pic = john_3、sex = 3、sex 1、 pic = pic_3.jpg}、{id = 4、sex = 0、name = john_2_4、pic = pic_4.jpg}]} {user = {{id = 6、sex = 0、name = name_6、pic = pic = pic_6.jpg}} {user = {id = 6、sex = 0 = pic = pic_6.6.jpg}、user sex = 0、name = john_2_0、pic = pic_0.jpg}、{id = 1、sex = 1、name = john_2_1、pic = pic_1.jpg}、{id = 2、sex = 0、name = john_2、john_2、pic = pic_2.jpg}、 {id = 4、sex = 0、name = john_2_4、pic = pic_4.jpg}]}6)最後に、コードをメインメソッドにWebレイヤーに配置し、クエリパラメーターを定義するだけで、クエリサービスを簡単に構築できます。元のクエリインターフェイスは、DataFetcherで引き続き呼び出されます。
7)Maven依存関係を紹介します
<Dependency> <GroupId> com.graphql-java </groupid> <artifactid> graphql-java </artifactid> <バージョン> 2.0.0 </version> </dependency>
GraphQLクエリの定義については、これが役立つ場合があります
JSON
{id = 6、sex = 0、name = "name_6"、pic = "pic_6.jpg"}クエリ
{id、sex、name、pic}後者の部分は実際にはJSON文字列です。削除の結果と値はまだ読み取り可能です。
結論
GraphQLは、Web APIの開発を簡素化できる新しい考え方をもたらします。クライアントは、どのデータが必要か、サーバーによって返されるデータを指定し、不必要なトラフィック伝送を削減し、モバイル端子に友好的であり、さまざまなデータ集約クエリも提供します。複数のクエリは、APIの最小粒度を満たすだけでなく、フロントエンドのニーズを満たし、リクエストを減らし、パフォーマンスを向上させるリクエストを1つだけ使用します。
私は、一般的な傾向によって駆動されて、将来この方向に発展すると感じています。