A preview of MicroProfile GraphQL

このエントリは以下のエントリをベースにしています。
This entry is based on the following one, written by Jean-François James (Senior Software Architect, Worldline by Atos Worldline).
https://jefrajames.wordpress.com/2019/07/25/a-preview-of-microprofile-graphql/

このエントリはmpql-previewプロジェクトと関係があります。

A preview of the future MicroProfile GraphQL specification
https://github.com/jefrajames/mpql-preview

Objectives

このプロジェクトは将来のEclipse MicroProfile GraphQL仕様のプレビューを提供することを目的としています。MicroProfile GraphQLをご存知ない場合は、以前のエントリとGitHubをご覧ください。手短に言えば、MicroProfile GraphQLは、モダンなAPIを開発するためにGraphQLをMicroProfileプラットフォームにおける第一級の市民とすることを目的としています。

When GraphQL meets MicroProfile
https://jefrajames.wordpress.com/2019/01/04/when-graphql-meets-microprofile/
https://logico-jp.io/2019/04/22/when-graphql-meets-microprofile/
MicroProfile GraphQL
https://github.com/eclipse/microprofile-graphql

GraphQLはFacebookが作った仕様で2018年11月からLinux Foundationがホストしています。クライアントサイドを非常に柔軟に作成でき、特にデータ指向APIに関連しています。

GraphQL
https://graphql.github.io/graphql-spec/

GraphQLについて知りたい方は、Bojan Tomicのすばらしいチュートリアルを辿ってください。

graphql-java Tutorial – Introduction
https://www.howtographql.com/graphql-java/0-introduction/

Status of Eclipse MicroProfile GraphQL

MicroProfile GraphQLはEclipseプロジェクトで、2018年12月にスタートしました。コードファーストのアプローチに従うGraphQLアプリケーションのための標準APIを定義することを目的としています。「コードファースト」とはGraphQLスキーマを事前に定義せず、アプリケーション起動時にJavaコードから導出することを意味します。

現在のAPIは一連のアノテーションのセットから構成されています。

プロジェクトはまだ開発途中ですが、既にお試し頂ける状態にあります。

  1. プロジェクトはGitHubからご覧頂けます。
    https://github.com/eclipse/microprofile-graphql
  2. APIはMaven Centralにパブリッシュ済みです。
    https://mvnrepository.com/artifact/org.eclipse.microprofile.graphql/microprofile-graphql-api
  3. 最初のプロトタイプ実装はspqrから提供されています。GitHubのmicroprofile-protpブランチでご覧頂けます。
    Java 8+ API for rapid development of GraphQL services
    https://github.com/leangen/graphql-spqr/tree/microprofile-proto

MicroProfile GraphQLの完全な実装がまだ利用できないことを除けば、試して頂ける状態にあります。

What is this preview project about?

このプロジェクトは3パートから構成されています。

  1. SuperHero デモアプリケーション
  2. SuperHeroアプリとspqr実装の間の糊 (glue) を作成するつなぐCDI拡張ベースのrunner。このglueが必要なのは、実際のMicroProfile GraphQL実装が現在開発中ゆえである。IBM、Red Hat、そしてTomitribeが現在開発に取り組んでいる。ServletもまたHTTPトランスポートを確保するためにrunner内で定義されている。
  3. テスト実行のための、基本的なGraphQLクライアント

Payara 5.192を使うJava EE Webアプリケーションとして開発されており、任意のJava EE 8プラットフォームで実行できます。

Building and running the project

Preambles

まず、JDK 8(もしくはそれ以降のJDK)とMaven 3.5がインストールされている必要があります。より細かく言えば、このプロジェクトは以下のコンポーネントを使って開発されました。

  1. Maven 3.6.1,
  2. OpenJDK 11.0.3 with OpenJ9.

Building the project

以下の手順を踏む必要があります。

  1. このプロジェクトを複製する
  2. spqrのmicroprofile-protoブランチをGitHubから複製する
    Java 8+ API for rapid development of GraphQL services
    https://github.com/leangen/graphql-spqr/tree/microprofile-proto
  3. ローカルでビルドしインストール(Maven Centralは利用できない)
  4. Payara 5.192をダウンロード
    https://www.payara.fish/software/downloads/
  5. Payaraを起動するため、 asadmin start-domain domain1 を実行(テスト目的で必要)
  6. Mavenを使ってプロジェクトをビルド
  7. WARファイルができたら、お気に入りのIDEを使って自由にソースコードを変更したり、アプリケーションサーバーを変更したり…

コードの変更時には、少なくとも1個の@GraphQLApiクラスがアプリケーションを起動するものと想定されていることにご注意ください。

Running

SuperHeroアプリケーションを含むWARファイルはJava/Jakarta EE 8に完全準拠しており、任意のアプリケーションサーバーにデプロイできます。現時点でテスト済みの環境は以下の通りです。

  1. GlassFish 5.1
  2. OpenLiberty 19.0.5
  3. TomEE plus 8.0.0-M2
  4. Wildfly 16.0.0.Final

Playing around with GraphQL

アプリを開始して、Indexページに移動してください。この中に2個の選択肢があります。

  1. GraphQL スキーマのイントロスペクト
    これはGraphQLの重要なコンセプトで、サーバーとクライアント間の契約(Contract)として機能します。ところで、GraphQLはネイティブのイントロスペクションを提供します。
  2. GraphQLを使う
    SuperHeroアプリケーションと対話するためにGraphQLを使います。GraphiQLは対話的なJavaScriptベースのツールで、Webブラウザからクエリやmutationの送信を実現します。
    An in-browser IDE for exploring GraphQL.
    https://github.com/graphql/graphiql

GraphQL の構文に不慣れな場合、graphql-config.propertiesファイルに定義済みのテストで使うクエリをCopy & Pasteしてもかまいません。

全てのヒーローを取り出すには

query allHeroes {
  allHeroes {
    name
    primaryLocation
    superPowers
    realName
  }
}

Avengers チームに属するヒーローを取り出すには

query allAvengers {
  allHeroesInTeam(team: "Avengers") {
    name
    primaryLocation
    superPowers
  }
}

指定されたスーパーパワーを持つAvengersチームの新しいヒーローを作成するには

mutation createNewHero {
  createNewHero(
    hero: {
           name: "Captain America", 
           realName: "Steven Rogers", 
           superPowers: ["Super strength", "Vibranium Shield"], 
           primaryLocation: "New York, NY", 
           teamAffiliations: [{name: "Avengers"}]
           }
         ) 
  {
  name
  primaryLocation
  superPowers
  realName
  }
}

是非、GitHub mpql-previewプロジェクトを是非ご覧ください。MicroProfile GraphQLで遊んでいただき、MicroProfile GraphQLにご期待ください。

A preview of the future MicroProfile GraphQL specification
https://github.com/jefrajames/mpql-preview

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google フォト

Google アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中