2017-07-06 6 views
0

彼のdissertationには、FieldingにREST APIに対応する一連のルールが定義されています。GraphQLとFieldingsのREST制約

これは、とりわけ、次のルールが含まれます。

  • クライアントサーバー
  • ステートレスキャッシュインタフェース
  • 制服契約(ハイパーメディアまたはHATEOAS、...)
  • レイヤードシステム

GraphQLでこれらの要件を満たすことは可能ですか?

ポイントクライアントとサーバー、ステートレスとレイヤードシステムはおそらく実現していますが、キャッシングポイントとユニフォーム契約についてはわかりません。

答えて

3

のはFieldings制約を通過し、GraphQLがそれらを満たしているかどうかをチェックしてみましょう:

クライアントサーバアーキテクチャ - YES

GraphQLは、クライアントからサーバへのクエリを指定し、(主に)クエリ言語です。

の無国籍 - YES

これは、詳細hereにdicussedされます。 短い答えはyesです.GraphQLはセッションの概念がなく、サーバーは要求を処理するための追加情報を必要としないため、Statelessです。

キャッシュ可能 - NO

この1はトリッキーです。技術的には、HTTPリクエストレベルでGraphQLクエリをキャッシュできます(use HTTPの場合)。しかし、クライアントはオブジェクトとプロパティの任意の組み合わせを照会できるため、そのようなキャッシュのヒット率はおそらく低く、キャッシュされた情報は非常に冗長です。このため、GraphQL開発者はgraph-based caching approachを提案します。しかし、このアプローチでは、グローバルに一意の識別子が必要であり、GraphQL仕様の上にRESTの「リソース識別」制約に似ている追加の制約が導入されています(下記参照)。

また、GraphQLサーバにデータを提供する他のコンポーネントへのキャッシングを延期することもできますが、これはGraphQL自体とは無関係です。上記を踏まえて、私はGraphQLリクエストがデフォルトでキャッシュ可能ではないと言っています。

階層化システム - YES

フィールディングdescribed階層化アーキテクチャのコンポーネントの動作を制約することによって階層からなる

...一つとして 、各コンポーネントが「見る」ことができませんそれらが相互作用している との直接の層を超えて。

クライアントがそれを知ることなく他のGraphQLサーバにリクエストを転送するように、GraphQLサーバを設定できます。実際には、GraphQLサーバはしばしば、フロントエンドのバックエンドとして使用され、クライアントが知らない他のサービスからのデータを集約します。これは階層化されたシステムです。

インタフェース/ユニフォーム契約 - NO

この制約は、多くの場合、4つのサブ制約を通じて処方される:リソースの

  • 身分 - NO

を上述したように、 GraphQLは、均一な resourcを識別するメカニズムを提供しませんes。 GraphQL documentation状態:

HTTPは、一般的にその コアコンセプトとして、「資源」を使用した、RESTと関連しています。対照的に、GraphQLの概念モデルは実体 グラフです。その結果、GraphQLのエンティティはURLで識別されません。

表現
介してリソースの
  • 操作 - (?)YES

のがGraphQLのリソースを仮定するデータオブジェクトであり、転送JSON(または他のフォーマット)が(表現であります単一のリソースとしてGraphqlのエンドポイント全体を見るのではなく)。次に、変更されたJSON表現をサーバーに送り返してオブジェクトを更新することができます。

  • 自己記述のメッセージ - (?)NO

この1つは、私の意見では、意見の問題です。メッセージはいつ自己説明的なのですか?クライアントとサーバーの間に任意に導入された中間層によって目標を「理解できる」ようにする場合、GraphQLメッセージは自己記述的ではないと主張します。クエリまたは突然変異の構造は、サーバースキーマのコンテキストでのみ意味があります。このスキーマはサーバーから要求できますが、これにより単一のメッセージの範囲が拡張されます。アプリケーション状態のエンジンとして

  • ハイパーメディア(HATEOS) - NO

この1つは単純です。 GraphQLは単にハイパーメディアの前提条件と本質であるリンクの概念をサポートしていません。 This articleにはこのトピックに関する興味深い意見があります。

コード・オン・デマンド(オプション) - NO

クライアントにGraphQLサーバーから送信されたすべてのデータが入力されます。サポートされているタイプは実行されません。アクションを表す突然変異要求は、クライアントからサーバーにのみ送信され、他の方向には送信されません。もちろん、コードをテキストとして送信することは常に可能ですが、それはおそらくGraphQLのために設計されたものではありません。


結論として、GraphQLはすべてのREST要件を満たしていません。それはおそらく意図されていなかった。主にクライアントが単一のオブジェクトグラフをフェッチするために複数のHTTPラウンドトリップを必要とし、順番に実際に使用されているよりも多くのデータを受け取るというRESTの原則から生じるいくつかの問題を解決することを目的としていました。

+0

この回答が正しいかどうかはわかりませんが、あなたがよく答えようとしているようです。 :-) – Brien

+0

すばらしい最初の答え。あなたは本当に良いと思っています! Stackoverflowへようこそ! – muetzerich