生涯未熟

生涯未熟

プログラミングをちょこちょこと。

GraphQLを勉強したのでGolangで書いてみた

ここ最近とてもGraphQLが盛り上がってますね! イベントも続々と開催されていたりするので、勢いを感じています。

そんなGraphQLを遅まきながら勉強してみました。

GraphQLとは?

既に様々な記事で論じられている内容なので割愛します。

この記事が個人的に一番分かりやすかったです。

qiita.com

実装してみよう!

それでは早速実装してみます。

今回はGolangを使い、サーバサイド側の実装を行います。

ライブラリ

ライブラリとしては以下を使いました。

github.com

こちらとも迷ったのですが、今回はStar数の多い方を使いました。

github.com

あとは、簡単にDBを使いたかったためSQLXを使用しました。

github.com

コード

実装してみたものは以下になります。

github.com

慌てて作ったものになるので、汚いですが一応動きます!

コード内でキモとなる部分は以下です。

  • schemaの定義
var queryType = graphql.NewObject(
    graphql.ObjectConfig {
        Name: "Query",
        Fields: graphql.Fields {
            "user": &graphql.Field {
                Type: userType,
                Args: graphql.FieldConfigArgument {
                    "id": &graphql.ArgumentConfig {
                        Type: graphql.String,
                    },
                },
                Resolve: func(p graphql.ResolveParams) (interface{}, error) {
                    idQuery, isOK := p.Args["id"].(string)
                    if isOK {
                        var u = user{}
                        err := DB.Get(&u, "SELECT * FROM user WHERE id=$1", idQuery)
                        if err != nil {
                            return nil, nil
                        }
                        return &u, nil
                    }

                    return nil, nil
                },
            },
        },
    },
)

ちょっと波動拳なコードになってしまっていますが、ここでschemaを定義しています。

今回は簡単な user のデータを返すschemaになります。

Queryとして userid を指定してもらい、それに対して resolve 、何を返すか?というのを指定してます。

そこで、実際にDBを照らし合わせてみて結果を返しています。

やってみて

結構記述量が多くなるので、実際にRESTfulなAPIからの書き換えになると大変だなーという小並感。

ただ、やるメリットは多大だと思うので積極的に使ってみたいですね!

goaのGraphQLバージョンとかあれば面白いな、とふと思ってみたり。

という感じで中身の薄い記事ですが、やってみた現場からは以上です!