汎用RPCとしてのGraphQL

これは、「 GraphQLとは」またはそれがなぜそれほどクールなのか、 実稼働環境でGraphQLを使用し経験に関する教育的な投稿ではありません。 私は、それがどのような技術であるか、そしてその応用に対する可能な実用的なアプローチについての私の意見を簡単に述べたいと思います。



したがって、GraphQLは、グラフDBMSからデータを抽出するためにFacebookで使用されるクエリ言語です。 この言語は非常に成功しているため、そのアプリケーションの潜在的な範囲ははるかに広くなっています。これは「REST killer」と呼ばれ、次のデータモデル管理エンジンとしての反応にねじ込まれています。 GraphQLの概要:



-リクエストは、レスポンスで返される必要があるフィールドのリストです。 要求されたフィールドのみが返されます

-フィールドは同じ名前のメソッドであることが判明する場合-このメソッドのパラメーターは、リクエストで直接示されます:{name、surname、age、getLikesCount(since: "01.01.2016")}

-フィールドまたはメソッドの値がオブジェクトの場合、フィールドのリストを明示的に指定する必要もあります:{name、surname、age、bestFriend:{name}}



まさに革新的なものについてはさまざまな意見がありますが、最も興味深いアイデアは次のとおりです。



データモデルは、APIモデルの特殊なケースです。



実際、任意のjsonでフィールドを空のパラメーターリストを持つメソッドに置き換えると、何らかの切り捨てられたAPIが得られます。



{ name: "John", age: 25 friends: [{ name: "Jenny", age: 24 }] }
      
      





になります



 interface Human { name(): string age(): int friends: Human[] }
      
      





この例は重要な結果を示しています-APIとデータが同一で​​ある場合、APIは他のAPIへのリンクを返すことができます。 データ(または他のAPI)を返すメソッドを提供するオブジェクトに。 重要な点は、メソッドがi等である必要はまったくなく、更新/削除または単なるビジネスロジックの呼び出しである可能性があることです。



何にも似ていませんか? たとえば、実行中のプログラム内のオブジェクトのグラフ? 実際、GraphQLクエリは、呼び出す必要があるルートオブジェクトのメソッドのリストであり、他の機能もあります。



-強力なタイピング

-インターフェースのサポート

-データ構造としてのスキーマの文書化された表現



GraphQLを使用すると、任意のオブジェクトをネットワークに公開できることがわかります。 そして、特に、HibernateタイプORMを使用して自己記述またはアセンブルされたアクティブドメインモデル



多くの人はgraphQLの冗長性、チップとローションのセットが好きではありません。彼はそれをFacebookで使っている間に成長しました。 それらの多くは、node.jsおよび特定の開発スタイルのコンテキストでのみ意味をなします。 しかし、回路があり、RPCと言った場合、明らかな解決策はコード生成です。 このすべての「クエリ」、「突然変異」、および変数宣言を含む冗長クエリがAPIの背後に隠されている場合、この欠陥は平準化されます。



全体として、出力はjsonをトランスポートとして使用し、GraphQLのプリミティブ(ハーフスピットで記述されたパーサー)サブセットを使用して、型付きの文書化されたオブジェクト APIをネットワークに配置できるRPCフレームワークです。 呼び出しに便利なインターフェイスを提供するクライアントコードジェネレーターもあります。



それを書くために残っています:)



ありがとう



All Articles