🌊
HaskellでGraphQLを使用するサンプルを動かす
概要
HaskellでGraphQLを使用するライブラリとしてMorpheusを使用しようと考えました。しかしhackageやリポジトリのトップで示されているサンプルコードは、ライブラリ本体もしくはstack.yaml:resolver:ltsのバージョンが古いことと、素直にコピペしても動作しなかったので、リポジトリにひっそりと存在するサンプルコードを使用しました。そのサンプルのコンパイル及び実行方法を示します。
ソフト環境
名前 | バージョン |
---|---|
OS | Ubuntu 20.04 |
ghcup | 0.1.19.4 |
git | 2.25.1 |
curl | 7.71.1 |
ハード環境
名前 | バージョン |
---|---|
CPU | AMD Ryzen 9 3900XT 12-Core |
GPU | RTX3080 |
RAM | 76GB |
手順
リポジトリをcloneして任意バージョンをcheckoutします。記事作成時点で0.27.3がlatestタグだったのでこれにしました。
git clone https://github.com/morpheusgraphql/morpheus-graphql.git
git checkout 0.27.3
サンプルのフォルダに移動しビルドします。
cd morpheus-graphql/examples/servant
stack init
stack build
確認
morpheus-graphql/examples/servant
上記でビルドしたのは、GraphQLをWebAPIとして提供するサーバです。以下により実行します。
stack run
何も表示されませんが、これによりhttp://localhost:3000
にてサーバが動きます。ufwなどでファイアウォールが掛かっている場合は許可してください。
以下実行すると返答があります。
curl -X POST -H "Content-Type: application/json" --data '{ "query": "{ deity (name: \"Morpheus\") { name, power } }" }' localhost:3000/gql
返答:
{"data":{"deity":{"name":"Morpheus","power":"Shapeshifting \n "}}}
サンプル解説
Morpheus自体はGraphQLの処理のみで、サーバ関連コードは別のライブラリで動いています。Morpheusのメイン処理は以下で行っています。
morpheus-graphql/examples/servant/src/Server/API/Simple.hs
同フォルダのsimple.gql
がGraphQLのスキーマです。これを読み取って使用しています。vscodeで開くといい感じです。
実行時のポートの設定は以下で行っています。
view src/Server/Utils.hs
Discussion