Please enable JavaScript.
Coggle requires JavaScript to display documents.
GraphQLを使ってアプリを作っている話 - Coggle Diagram
GraphQLを使ってアプリを作っている話
GraphQLFragmentGeneratorについて
メリット
Entityクラスでのフィールド定義とGraphQLのクエリのselectionが一致するので、タイプミスなどなく型安全
class フィールドに定義しておけば、欲しいフィールドが自動
フィールドに定義しているのにリクエストしてない、ということがなくなる。
未対応のもの
Drinkはジャンルを参照、ジャンルはDrinkを参照している場合
Variable
https://graphql.org/learn/queries/#variables
Directive
https://graphql.org/learn/queries/#directives
対応してるもの
Listに対応
デメリット
ライブラリを使うことによってコードが自分の管理下にないので、不具合などあればissueたてたり、PRしたりして
修正を待つ必要がある
今後対応したいもの
再帰Fragment
Fragmentは条件を書けば再帰に的にかける
Fragmentを生成するのとは別かもだが、仕様から生成できるよようになると楽かも
実際にnomemoでも使っています
他の開発者からは
便利だった
欲しい情報が増えたときに、フィールドにも追加して、クエリにも追加しなあかんから面倒くさいなぁと思ってたら、buildしただけで動いてくれたので便利だった
という声を頂いてます。
GraphQLとは?
Web APIの規格の1つ
クエリ言語
RESTではエンドポイントに対して決まったレスポンスが返って来るのに対して、GraphQLではクライアントで欲しいデータを指定します。
https://graphql.org/
TODO document, variablesの説明もする
RESTではたとえば一画面に必要なデータを取得するために、複数のリクエストが必要になることがあった。
欲しいデータを指定すればいいので1リクエストでよくなる
コレに関しては、WebAPIを使ったアプリを作る際はAPI側も画面に最適化された設計になっているのでだいたい1リクエスト良い場合が多いため、あんまり良さをりかいできてません。
オープンなAPIを使うときなんかは、欲しい情報は1エンドポイントにすべてあるわけではないので、GraphQLが良いかもしれない。
クライアントサイドから見たGraphQLの良いところを挙げてみたいと思います。
実際使ってみたGraphQLの良いところ
一番はAPI仕様のドキュメント更新の漏れが減ること。
RESTの場合、API仕様って結構サーバー側のソースと遠い場所にあって(たとえば、スプレッドシートだったりGitHubのWikiだったり)、ソースと遠いからメンテナンスがおろそかになりがちでした。
GraphQLの場合は、ソースの決まった場所にAPIの説明を書いておけば、ツールを介してAPIドキュメントを表示でき、ソースにあることで、仕様変更で実装変えたけど、APIドキュメントを変更漏れが少なくなる
POSTしかないところ
GraphQLでデータ取得系はQuery、更新系はMutation
このアプリでGraphQLをどのように使っているか
ドキュメントを次のように作っていた
リクエストごとにドキュメントを作っていた
TimelineRequestでドキュメントを定義しただけのGetTimeline.dart を作ってそれを参照する
また別のたとえばUserの1人のタイムラインを取得するためのRequestではそれ用のドキュメントのdartファイル作成
それだと、Userフィールドなど同じものが別々のファイルにある状態になってしまった。
共通化したい
#
共通化するために各Entityクラスにfragment nameとfragmentを定義した
これで共通化できた。
でもentityのフィールドとfragmentのフィールドは同じになるはず
entityからfragmentを自動生成できるのでは?
作りました!GraphQLFragmentGnerator
#
NomemoではGraphQL使っている
graphqlプラグインを使用
どのように使っているか紹介したいと思います。
graphql_flutterという同じところが作ったプラグインもあるが、APIリクエストがFlutterのWidgetで行えるもので、ViewとAPIリクエストが密になって、クリーンアーキテクチャの設計には合わない。
graphqlプラグインはgraphql_flutterの一部なので、graphql_flutterを使っても同じことができはする。
使い始めた2019年1月頃はgraphql_flutterしかなかった。
このNomemoでどのようにGraphQLAPIクライアントを実装しているかを紹介させてください。
https://github.com/zino-app/graphql-flutter/blob/master/packages/graphql/example/bin/main.dart#L17-L33
基本的にはこのとおり。
casheにNormalizedInMemoryCacheを使用
httpClientにCurl出力をラップしたclientを実装したものを使用
curl部分便利
GraphQLClientを使って実際のリクエストしてレスポンスを受けるためのクラスを作成
実際にリクエストするのはRequestを継承したクラス
_session.request(TimelineRequest())みたいに使う
具体的には
class TimelineRequest extends Request
String get document => ドキュメント
Map<String, dynamic> variables => <String, dynamic> { "id" : id }
List<TimelineEntity> parseResponse(data) {
// JsonSeriarizationなどを使ってパースしたものを返す
Request<T> は GraphQLのdocument, variablesとレスポンスをパースするためのメソッドを持っています。
おわりに
GraphQLについて簡単に紹介しました。
GraphQLを使うのにgraphqlプラグインがあります。
それをNomemoでどのように使っているか紹介しました。
GraphQLクエリの組み立てに工夫している点として、クラスフィールドからfragmentを自動生成するプラグインを紹介しました。
fragmentを使う際は、GraphQL Fragment Genreatorを使えば、過不足なく安全にfragmentを生成できます。
良きGraphQLライフを!
なぜこのテーマか?
現在GraphQLを使ってアプリを作成している
どんなアプリを作っている?
Nomemo
Graphqlの日本語記事が軽く検索した感じだとほとんどなく、共有できればと思った
作ってるアプリとは?
Nomemoを作っている
簡単に言うと、Swarm(4sq)というアプリが場所に対してチェックインするというのに似ていて、場所ではなくお酒にチェックインして楽しもうというコンセプトのSNSのアプリです。
たとえば、1人で飲むときに乾杯することはあまりないと思いますが、このアプリを使ってチェックインすれば、他の人から乾杯という形で通知が来て、乾杯した気分になり楽しんでもらうことができます。
また、最近だとオンライン飲み会などでチェックインすれば、オンライン飲み会参加者全員からとフレンドになっている人から乾杯された気分になることができます。
お酒を飲んだ記録にもなり、何を飲んだか後で見返すことも可能になります。
ただし酔っ払ってチェックインしなくなることもあると思うので、これは正確なることはないと思いますが(笑)
SNSなので友達としてつながれば次のようなことが可能です。
タイムライン、ユーザーのタイムラインを紹介
同じものをリクエストしていることを説明
はじめに
自己紹介
河本といいます。
2018年GoogleIOに参加してぐらいからFlutterに触り始めた
Flutterバージョンでいうと0.5ぐらい
https://github.com/flutter/flutter/releases?after=v0.6.0
そのころからFlutterってどんな感じなのか知るためにチャットアプリを作り始めた
なにか1つアプリ作った方が理解が早いと思ったため
作っていくなかでいろいろ情報共有してきた
https://kwmt27.net/tags/flutter/page/3/
https://speakerdeck.com/yasi
Softwware Designに4ページほどですが、Flutterの紹介記事も書かせて頂いたこともあります。
新しいことだったので楽しかったが、結構つらかった
楽しい >> つらい
iOSとAndroid挙動がちがう
プッシュ通知うけるだけでクラッシュ
使っているプラグイン側でビルドエラーになるので、原因調べてPRしたりその間forkしたものを使ったり。
2019年3月にFlutter Meetup Tokyoさんでアプリ内課金について登壇させてもらったことを最後にしばらくFlutterはやらなくなりました。
https://github.com/kwmt/flutter-inconne
現在techveinという会社に在籍していまして、受託がメインの4人の会社です。
会社でなんかアプリ作りたいねという話になった
Flutterでやってみよう
サーバーはGraphQLで。