春ブーツとGraphQLの使用を開始

1.はじめに

GraphQLは、代替RESTインタフェーススタイルとして、書き込みのWeb APIに私たちの時間を可能にFacebookやからかなり新しい概念です。この記事では、春ブーツを通じて当社GraphQLサービスを構築する方法を説明しますので、簡単に既存のプロジェクトまたは新規プロジェクトの両方を使用することができます。

2. GraphQLは何ですか?

REST APIは、書き込みにサーバー管理資源の伝統的な考え方に基づいています。これらのリソースはそれにアクセスするために、いくつかのHTTPリクエスト動詞(GET、POST、PUT、DELETE)によって定義することができます。私たちは少し変更した場合、当社のインターフェースと経営資源の考え方と矛盾が、しかし、物事は問題になり始めたときには問題が動作しません。

インスタンスの記事やブログの私たちの対応する要求にコメント:これが私たちのクライアントは、異なるデータの数を要求し、同時に起こります。通常、我々は唯一のクライアントから複数の要求を行い、またはサーバーが同じインターフェイスでこれらの追加のデータを提供させますが、データは常にRESTの設計に違反している、必要なだけでなく、サービスを主導していないことができます終了応答パケットは、ネットワーク伝送の浪費をもたらす、大きくなります。

GraphQLは、同じプログラムでこの2つの問題を解決することができます提供。これは、クライアントが要求に必要なデータを指定することができ、それはまた、複数のクエリを送信するためのリクエストで実現することができます。

これは、より多くのRPCサービス、それが動詞に固定されるべきではなく、使用のように働くという名前のクエリ(クエリ)名称変更(変異)の方法。これは、データが、彼らが望むものを示す実行時に動的に、その適切な場所にビジネスバックの準備を制御することができます動作が許可されているインタフェースを決定するためにAPIを開発者インタフェース、ユーザインタフェースAPI

たとえば、ブログは次のクエリことがあります

query {
    recentPosts(count: 10,offset: 0) {
        id
        title
        category
        author {
            id
            name
            thumbnail
        }
    }
}
复制代码

このクエリは、要求します:

  • 最新の10件の記事をリクエスト
  • 各記事には、ID、タイトル、カテゴリフィールドを返します。
  • 各記事は、執筆者が返されますために、著者情報は、ID、名前、サムネイルが含まれています

それはどちらか11リクエストを送信する必要がある伝統的なRESTのAPIで - インターフェイスは、記事のリストを要求するために使用され、他の10個のインタフェース要求は、著者が対応します。または著者の情報にサーバ側/ポスト・インタフェースを必要とするが含まれています。

2.1。GraphQLスキーマ

GraphQLサービスは、すべてのAPIインタフェースの完全な説明のためのスキーマを提供します。このスキーマファイルは、特定のデータ型定義(タイプ)が含まれています。各データ・タイプが1つまたは複数のフィールド(フィールド)を有していてもよく、各フィールドは、ゼロ以上のパラメータ(パラメータ)であり、対応するタイプ(型)を返します。

これらのフィールドの組み合わせをネストすることにより、データ構造(すなわちGraphQLグラフにおける意味)を形成します。図は、リング全体を避けるために持っていない、また、リングは完全に許容見えるが、それは有向グラフでなければなりません。言い換えれば、クライアントは、フィールドのノードタイプによって、その子ノードを見つけることができますが、(それは別にスキーマで定義されていない限り)、子ノードを介して直接逆父ノードを見つけることができません。

ポスト構造、ポスト著者Authorフィールドで対応する構造、およびルート・ポスト(ルート照会)フィールドノードrecentPostsから最新のクエリを見つけるために、次の型定義が含まれている。例えば、単にブログ、

type Post {
    id: ID!
    title: String!
    text: String!
    category: String
    author: Author!
}
 
type Author {
    id: ID!
    name: String!
    thumbnail: String
    posts: [Post]!
}
 
# 整个应用的根查询(读操作),它也是一个类型
type Query {
    recentPosts(count: Int,offset: Int): [Post]!
}
 
# 整个应用的根修改 (写操作)
type Mutation {
    writePost(title: String!,text: String!,category: String) : Post!
}
复制代码

オプションであるフィールドが空でないことを、そうでない場合は、ノートに「!」という意味を持ついくつかのフィールドタイプの後ろ。私たちは、対応するサーバがnullのオブジェクトを返す場合、GraphQLが適切にフォローアップのクエリを処理することができますインターフェイス、オプションのフィールドを要求すると、カテゴリのいくつかの記事でrecentPostsインタフェースは空であると言います。

そのクライアントがハンドルに簡単なスキーマ定義を先に得ることができるので、GraphQLサービスは、インタフェーススキーマを介して公開されています。これは、クライアントが自動的に検出し、動的データ構造を調整することができ、スキーマの変更時間を可能にします。シーンは、あなたがGraphiQLを使用することができます便利なツール(ポストマンのような、などRESTクライアント)サーバーと対話する(途中1より多くの私があることに注意してください)です。

3. GraphQL春ブーツ初心者入門

春ブーツGraphQLスターターは、 私たちはすぐにGraphQLサービスを実行するための便利な方法を提供します。これGraphQLのJavaツールみましょうちょうど書き込み少ないコードとを起動することができます。

3.1。構成サービス

私たちは、次の依存関係を追加する必要があります。

<dependency>
    <groupId>com.graphql-java</groupId>
    <artifactId>graphql-spring-boot-starter</artifactId>
    <version>5.0.2</version>
</dependency>
<dependency>
    <groupId>com.graphql-java</groupId>
    <artifactId>graphql-java-tools</artifactId>
    <version>5.2.4</version>
</dependency>
复制代码

スプリングブート自動的に適切なハンドラを設定しますデフォルトをGraphQLサービスが通過する/ graphqlインターフェース露出し、インタフェースは対処することができるPOSTを介して、対応するリクエストを送信することができるインターフェースapplication.propertiesが変更,.

3.2定義スキーマ

GraphQLツール正しいGraphQLスキーマ・ファイルは、オブジェクトの処理構造によって生成され、対応するターゲットBeanに結合されてもよいです。長いこれらのスキーマファイルとして。「としたようGraphqls我々は、モジュール分割管理でこれらのファイルを置くことができるように拡張名を持つ」終わりとクラスパスに存在し、春ブーツGraphQLスターターは自動的に、これらのスキーマファイルを見つけることができます。しかし、我々はまた、ルートクエリを定義する必要があり、1つのルートクエリを持つことができます。突然変異または定義は、1を持つことはできません。この制限は、Javaを達成することができないではないので、GraphQLスキーマルールによるものです。

3.3。ルートクエリパーサ

その異なるクエリのフィールドを処理するために、春のJava Bean内の特定のオブジェクトを定義するには、ルート問い合わせが必要より多くのBeanオブジェクトを持つことができ、スキーマ定義ファイルとは異なり。私たちは、実装する必要がGraphQLQueryResolverのインタフェースを、各フィールドは、その上にプロパティまたは関数名に対応するスキーマを持っています。

public class Query implements GraphQLQueryResolver {
    private PostDao postDao;
    public List<Post> getRecentPosts(int count,int offset) {
        return postsDao.getRecentPosts(count,offset);
    }
}
复制代码

これらのプロパティまたは関数が、ルールの次の順序のためになります。

  • <フィールド>
  • <フィールド>はフィールドがされている場合のみブール変数
  • 取得<フィールド>

対応するフィールドのパラメータのスキーマ定義は、これらの機能は、対応する配列で定義されている(とオフセットとしてカウント)する必要がある場合は、最後の関数のパラメータは、オプションのことができますDataFetchingEnvironmentのいくつかのコンテキスト情報を取得するには、パラメータの種類を。我々が表示されますしながら、これらの関数の戻り値は、対応するスキーマとアップに必要とされています。すべてのネイティブ型の文字列、INT、リスト、およびその対応するJavaの型と対応ができます。

この上記のようなgetRecentPostsのの recentPostsでGraphQLスキーマこのクエリフィールドに対応する方法。

3.4。GraphQLは豆でオブジェクト型をマップします

GraphQLサービスで、それがルートまたはすべての複合型は、Java Beanオブジェクトに対応することができる任意の構造であるかどうか各GraphQLタイプにのみ対応して、Javaクラスを持つことができますが、Javaクラス名は名前とに入力する必要はありませんGraphQLとして属性名のJava BeanはGraphQLリターンデータのフィールド名にマップされます

public class Post {
    private String id;
    private String title;
    private String category;
    private String authorId;
}
复制代码

Java Bean内のプロパティとメソッドあなたがGraphQLスキーマに対応する定義を見つけることができない場合には問題なく、直接無視されます。このメカニズムは複雑な状況に対処するために使用することができます。例えば、ここでのauthorIdスキーマ内の任意のセットがないので、インタフェースには表示されませんが、それは次のステップで使用することができます。

3.5。フィールドは、複雑なオブジェクトを解決

時には、データフィールドと、それはデータベースクエリ、複雑な計算、またはいくつかの他の状況を伴うことが、直接アクセスすることはできません。GraphQLツールは、これらのシナリオに対処するためのメカニズム持って、それが春の豆は、豆を持つオブジェクトこれらの共通のデータに提供することができるが。

私たちは、とのビーン名の後ろに通常使用リゾルバを実装し、その後、およびGraphQLResolverのだけ,?あなたは普通の豆として解析追加フィールド、上記の命名規則に従うことを必要としている春の豆で、その後方法を提供することに春の豆を使用することができ、インタフェースを最初のパラメータは、これらの方法の違いは、豆、通常のオブジェクトとなります。フィールドは通常のビーンとリゾルバに存在する場合、それはリゾルバに優先されます。

@Repository
public class PostResolver implements GraphQLResolver<Post> {

    @Autowired
    private AuthorDao authorDao;
 
    public Author getAuthor(Post post) {
        return authorDao.getAuthorById(post.getAuthorId());
    }
}
复制代码

それは私たちの多くは、注入DAOを言って、春の戦略を使用することができますすることができますので、春文脈レゾルバは、ロードされます。

上記のように、クライアントは、対応するフィールドを要求しない場合、その後、GraphQLは、対応するデータを取得していませんこの手段クライアントはPOSTリクエストを取得するが、作者のフィールドには、リゾルバではない場合にGETAUTHOR()メソッドに対応するDAO要求が発行されないように呼び出されません。

3.6。オプションの値

オプションGraphQLスキーマは、いくつかのタイプの概念が空になるように選択することができている、他は非空です。これがnullを表すためにJavaで直接使用し、それは、Java 8の環境であれば、それに応じて処理することができ、オプションのいずれかの方法を表現するためにオプションの種類を使用することができ、システムが適切に処理することができます。このメカニズムは良く一緒に私たちのGraphQLスキーマとJavaコードの対応をさせることができます。

3.7。変更(突然変異)

今まで、私たちは、サーバーからデータを取得議論されている、GraphQL同じデータもGraphQLレーンでは、サーバー側に更新することができ変異です。コードの観点から、要求がクエリデータを直接変更することができない理由はありません、我々は簡単にパラメータを受け入れ、データを修正するためにリゾルバクエリを使用することができ、最終的に変異が主に良く調整するために使用されるクライアントに返されました。

従って、改変(変異)インターフェイスのみアクションがデータを格納するためにサーバを変更することをクライアントに通知するために使用されるべきである我々だけに必要とする、JavaコードでGraphQLQueryResolverのにインターフェイスGraphQLMutationResolverはルートを定義するインターフェースを変更する、他のすべてのルールができネスト等することができるように、クエリインタフェースは、インタフェースは、戻り値と、クエリインタフェースを変更します。

public class Mutation implements GraphQLMutationResolver {
    private PostDao postDao;
 
    public Post writePost(String title,String text,String category) {
        return postDao.savePost(title,text,category);
    }
}
复制代码

4.関連GraphiQL

GraphQLとGraphiQLはしばしば一緒に使用される、GraphiQLはあなたから、クエリおよび修正要求を実行することができ、GraphQLサービスインタフェース直接的かつインタラクティブなUIで、ここで GraphiQLの別々のアプリケーションベースの電子をダウンロードします。我々のアプリケーションでもGraphiQLのWebベースのバージョンに直接統合することができ、私たちは、次の依存関係を追加する必要があります

<dependency>
    <groupId>com.graphql-java</groupId>
    <artifactId>graphiql-spring-boot-starter</artifactId>
    <version>5.0.2</version>
</dependency>
复制代码

あなたは可能/ graphiql内の参照が、これは唯一のgraphqlインターフェイスに適用されます/ graphqlまた別のクライアントが必要な調整がある場合は、デフォルト。

5.まとめ

GraphQLが同じ視点、春ブーツGraphQLスターターとGraphQLのJavaツールは非常に簡単に組み合わせることがないとき、私たちは、インタフェースを開発することを可能にする非常にエキサイティングな新しい技術であり、それは簡単に既存のアプリケーションまたはに追加するために私達を許可します単に新しいアプリケーションを作成します。

私のブログ

おすすめ

転載: juejin.im/post/5dc97235e51d45225a3b84a7