ウェブサイト検索

GraphQLとは何か、そしてそれはRESTとどのように異なるのか?


GraphQLは、APIのためのクエリ言語およびランタイムリゾルバであり、複雑なデータを扱うサービスにより多くの構造をもたらすために使用されます。GraphQLを使用すると、クライアントは必要なデータだけを要求し、それ以上のものは要求しません。

違いはスキーマを設定する人です。

従来のREST APIは、リクエストに対して構造化されたデータ(通常はJSON形式)で応答するAPIサーバーを含みます。GETリクエストを送信すると

api.com/users/

あなたが期待する返答は、次のようなものになるかもしれません:

{

users: [

{

name: 'Anthony',

friends: [...]

}

]

}

あなたのアプリは異なる見た目になるでしょうが、要点はスキーマがRESTエンドポイントによって定義されているということです。あなたはただ/users/にリクエストを送っただけですが、すべてのデータが返されました。

これはうまく機能しますが、返されるデータが何であるかを知っている場合に限ります。また、これはウェブ上の大多数のサービスの標準です。ただし、PUTリクエストを行う場合、APIが機能するために正しいパラメータを提供する必要があります。さもなければ、エラーが発生します。もちろん、ユーザーIDを取得するなど、APIに値を渡すためにURLパラメータを使用することができ、これによりAPIをより動的にすることができます。

GraphQL APIは少し異なる方法で機能します。異なるデータの異なるエンドポイントに個別のリクエストを送るのではなく、GraphQLアプリケーションは単一のオリジンにリクエストを送ります。リクエストボディにはスキーマが含まれており、APIにどのデータを返すべきかを指示します。この方法により、複雑なデータをたった一度のリクエストで要求でき、APIは指示されている以上のデータを返すことがなく、大きなレスポンスサイズを削減します。

例えば、特定のユーザーのメールアドレスをリクエストしたい場合、次のクエリを使ってapi.comエンドポイントにGraphQLリクエストを送信できます。

{

users(name: "Anthony") {

email

}

}

「ユーザー」オブジェクトが他の情報のためのフィールドを含んでいても問題ではありません; あなたが求めたのはメールアドレスだけなので、送信されるのはメールアドレスだけです。もちろん、まだRESTのようなJSONオブジェクトが送信されており、同じ方法で通信しているのですが、リクエストはより情報量が豊富です。

複雑なスキーマを持つアプリケーションにとって、この種のAPIは組織的な理由から非常に便利です。GraphQLを使うと、APIを設定する際にスキーマを厳密に定義しなければならず、これは静的型付けが構造体や型に従うことを強制するのに似ています。データの構造は簡単に参照可能で、変更も容易です。標準のREST APIでも同様の効果を実現することは可能ですが、GraphQLはそれを強制します。

さらに、GraphQLのクエリはより効率的である場合があります。例えば、一般的な問題として「友達の友達」クエリがあります。REST APIでは、まず対象のユーザーについてリクエストを送信し、彼の友達のIDを受け取った後、各友達の情報を取得するために個別にリクエストを送信し、必要な情報をフィルタリングする必要があります。もちろん、このクエリをデータベース側で行うための新しいエンドポイントを実装することもできます(実際に行うべきです)が、それは本当の問題への応急処置に過ぎません。

GraphQLを使用すると、このクエリはシンプルです。あなたは各友達の名前を取得したいだけを指定すればよく、(バックエンドがこれを適切に処理するように設定されていれば)APIは特別な設定なしに自然にこのインタラクションを処理します。

{

users(name: "Anthony") {

friends {

name

}

}

}

もちろん、GraphQLには欠点もあります。シンプルなアプリケーションには、基本的なRESTエンドポイントを置き換えるにはあまりにも複雑すぎます。また、従来のREST APIでは、異なるルートを分割する利点があります。例えば、/usersと/postsは別々のサーバーレスLambda関数で処理され、それぞれ独立して作業したり更新したりできます。これはマイクロサービスバックエンドとして知られる概念です。GraphQLでは、はるかに集中化されており、別々の部分に分割するのは難しい(とはいえ不可能ではない)です。

どうやって始めますか?

GraphQLには、さまざまな言語用のサーバーライブラリがたくさんありますが、一般的にはJavaScriptとNodeJSと一緒に使用されます。

GraphQLクエリには2つのものが必要です---データの構造と型を定義するスキーマ、そして入力を取り込み、スキーマに関連付けられた値を返すリゾルバです。リゾルバの中では、データベースのリクエストを取得したり、データを変更したり、必要なアクションを実行することができますが、最終的にはスキーマに一致する戻り値に集約される必要があります。

複雑なアプリでは、スキーマと関連するリゾルバーは構造に基づいて自動的に生成されることがありますが、最終的にはスキーマは単なる型定義であり、リゾルバーはスキーマ内の異なるキーを解決する関数を持つオブジェクトに過ぎません。

var { graphql, buildSchema } = require('graphql');

// Construct a schema, using GraphQL schema language

var schema = buildSchema(`

type Query {

hello: String

}

`);

// The root provides a resolver function for each API endpoint

var root = {

hello: () => {

return 'Hello world!';

},

};

// Run the GraphQL query '{ hello }' and print out the response

graphql(schema, '{ hello }', root).then((response) => {

console.log(response);

});

GraphQLサーバーをフルに設定する方法についての詳細は、Expressとのインストールと使用に関するGraphQLのガイドを読むことができます。

関連記事: