従来の Restful API には多くの問題があり、まず返されるフィールドを制御できず、フロントエンドはバックエンドの戻り結果を予測できません。結果は異なるリクエスト アドレスに対応します。これは、複数のリクエストが発生したことを意味します。 GraphQL はこのような背景に基づいて構築された API クエリ言語であり、従来の Restful API と比較して次のような利点があります:
柔軟性: GraphQL はクライアントのニーズに応じて柔軟に対応できます。 RESTful API のように固定構造のデータを返すのではなく、データを効率的にクエリします。
ネットワーク リクエストの削減: GraphQL を使用すると、クライアントは 1 つのリクエストで複数のリソースを取得できるため、ネットワーク リクエストの数が削減され、パフォーマンスが向上します。
強力な型指定: GraphQL には、クライアントがコンパイル時にクエリ内のエラーを検出できるようにする強力な型指定システムがあり、実行時エラーの削減に役立ちます。
キャッシュ可能: GraphQL はキャッシュ可能です。つまり、サーバーはクエリの結果をキャッシュできるため、パフォーマンスとスケーラビリティが向上します。
ドキュメント: GraphQL には自己ドキュメント化機能があり、開発者は API の構造と機能をすぐに理解できます。
バックエンド言語が Java の場合、GraphQL Java は GraphQL を実装するための基本ライブラリです。また、Spring には GraphQL が統合されているため、プロジェクトで Spring を使用する場合は Spring GraphQL の方が推奨されます。
Spring GraphQL の開発は通常、次の手順に分かれています。
Spring GraphQL 依存関係を追加する
Spring GraphQL 依存関係をプロジェクトに追加します。 Maven や Gradle などのビルド ツールを使用して依存関係を追加できます。たとえば、Maven を使用する場合は、アプリケーションに次の依存関係
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-graphql</artifactId> </dependency>
Define GraphQL Schema
Define GraphQL Schema を追加できます。スキーマはクエリ可能な型とフィールドを定義します。スキーマは、SDL (スキーマ定義言語) を使用して、またはプログラム的に定義できます。
Spring Boot プロジェクトの場合、スキーマ ファイルは resource/graphql/ ディレクトリに配置され、ファイル名にはgraphqls が接尾辞として付けられます。以下は私が定義した単純な schema.graphqls です。
これは 2 つのクエリ実装を指定します。author(id:Int) は ID で Author をクエリすることを意味し、allAuthors は Author 配列をクエリすることを意味します。
スキーマ {
クエリ: Query
}type クエリ {
author(id:Int): Author
allAuthors: [著者]
}作成者を入力 {
id:Int
firstName:String
lastName:String
email:String
Birthdate:String
}
RuntimeWiringConfigurer の実装
RuntimeWiringConfigurer は、データを取得するための GraphQL 実装の中核です。GraphQL を使用しても、Mybatis/Jpa などの永続層フレームワークを直接削除することはできません。データベースからデータを取得するには、引き続きそのようなフレームワークのサポートが必要です。
RuntimeWiringConfigurer は Spring のサービス層に似ており、基本データの実装の中核となります。
次は簡単な例です:
@Component public class AuthorWiring implements RuntimeWiringConfigurer { private final AuthorRepository authorRepository; public AuthorWiring(AuthorRepository authorRepository) { this.authorRepository = authorRepository; } @Override public void configure(RuntimeWiring.Builder builder) { builder.type("Query", typeWiring -> typeWiring .dataFetcher("allAuthors", environment -> authorRepository.findAll()) .dataFetcher("author", environment -> authorRepository.getReferenceById(environment.getArgument("id"))) } }
ここでは、author と allAuthors がデータをクエリする方法を指定するために、configure メソッド内で 2 つの DataFetcher オブジェクトが定義されています。クエリデータ クエリデータ
GraphQL コントローラーの定義
Web リクエストの入力パラメーターを受け取るために GraphQLController を定義します。例は次のとおりです:
@RestController @RequestMapping("graphql") public class GraphQLController { private final GraphQL graphQL; @Autowired public GraphQLController(GraphQlSource graphQlSource) { graphQL = graphQlSource.graphQl(); } @PostMapping("query") public ResponseEntity<Object> query(@RequestBody String query) { ExecutionResult result = graphQL.execute(query); return ResponseEntity.ok(result.getData()); } }
コード内の GraphQL オブジェクトは、クエリを実行しますが、GraphQL のプライベート コンストラクターは 1 つしかないため、直接注入することはできず、GraphQlSource を注入して GraphQL オブジェクトを取得する必要があります。
GraphQL ではパラメータの受け取りに String のみを使用でき、モデル オブジェクトは使用できないことに注意してください。これは、Graph リクエスト パラメータが JSON 構造ではないためです。
テスト グラフ リクエスト
アイデアで http リクエストを実行するためにgraphql.http ファイルを作成します
}Content-Type: application/json
json 本体を含む POST リクエストを送信します
POST http://localhost:8080/graphql/query}
{
author(id: 1) {
id
firstName
lastName
生年月日
}POST http://localhost:8080/graphql/query
json 本文を含む POST リクエストを送信Content -Type: application /json
}
{
allAuthors {
id
firstName
lastName
Birthdate
クエリを実行するauthor(id:1)の場合、結果が正常に返されることがわかります。 firstName フィールドと lastName フィールドのみが必要な場合は、バックエンド コードを変更せずに、リクエスト入力パラメーターから id と誕生日を削除するだけです。
######以上がSpringBoot が GraphQL を使用して Web API を開発する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。