GithubのGraphQLを触ったメモ書き

最近GraphQLなる言葉をよく見るようになったので、調べつつ、習うより慣れろで触ってみたのでその形跡を残します。

GraphQLとは

GraphQLを読んだ印象としては、API越しのQuery languageと理解しました。 RESTの次のパラダイムはGraphQLかにもあるようにREST APIとの対比で語られているようです。

自分でもなんらかのサービスで提供されているAPIを叩くことがありますが、レスポンスには実際に欲しいデータだけでなく、余分なデータも含まれています。リクエストを投げる時点で欲しい情報をクエリパラメタとして渡してあげることで、必要な情報だけをレスポンスとして得られるのが利点と考えます。 RESTの次のパラダイムはGraphQLかでは、その他の問題も完結にまとめられているのでわかりやすいです。

GithubのExploreで触ってみる

GithubGUIでGraphQLを触れるExploreを提供してくれているので、実際に触って所感を掴みましょう。 クエリのReferenceはこちら

以下は「自分のレポジトリを更新順に並べ、最初のn個を取得」するクエリです。 変数を$nとして受け取らせています。 また、viewerがログインしているユーザ(自分自身)を表します。

// query
query($n: Int!){
  viewer {
    repositories(orderBy: {field: UPDATED_AT, direction: DESC}, first: $n) {
      edges {
        node {
          name
        }
      }
    }
  }
}

// variables
{
  "n": 3
}

これを実行すると以下のようにjsonでレスポンスが返ってきます。

{
  "data": {
    "viewer": {
      "repositories": {
        "edges": [
          {
            "node": {
              "name": "goSExpression-sample"
            }
          },
          {
            "node": {
              "name": "poloniex"
            }
          },
          {
            "node": {
              "name": "goXML"
            }
          }
        ]
      }
    }
  }
}

型がある

GraphQLでは型も定義されており、今回の例だと repositoriesorderByフィールドはRepositoryOrder型になります。 ReferenceにもあるようにRepositoryOrderField型のfieldOrderDirection型のdirectionをメンバとして持っています。

なので以下のようにhogeという誤った型のクエリをわざと発行してみます。

query($n: Int!){
  viewer {
    repositories(orderBy: hoge, first: $n) {
      edges {
        node {
          name
        }
      }
    }
  }
}

すると以下のように、型が違うエラーが返ってくる実装になっていました。

{
  "data": null,
  "errors": [
    {
      "message": "Argument 'orderBy' on Field 'repositories' has an invalid value. Expected type 'RepositoryOrder'.",
      "locations": [
        {
          "line": 3,
          "column": 5
        }
      ]
    }
  ]
}

感想

とりあえず触ってみたというレベルですが、GraphQLでした。今後RESTを置き換えていくのかはわかりませんが、型があり、必要な情報だけを取ってこれるというのは場面によっては有効そうです。 RESTがこれだけ世の中に溢れていることを考えると、RESTからの移行をどうやって設計するのかなど考えるのは楽しそうですね。

Reference