🌊

HaskellでGraphQLを使用するサンプルを動かす

2023/08/21に公開

概要

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