「お~、こんなのチョロいやろ。チョロい~~ん。」などと思っていたのですが(ドキュメントちゃんと読まなかったせいで)チョロくなかったのでメモ。

詰まったところ


エンドポイント

エンドポイントはhttps://api.github.com/graphqlです。(https://api.github.com/を叩いてました…)

The GraphQL endpoint

HTTPメソッド

GETじゃなくてPOSTです。

Communicating with GraphQL

ペイロード

GraphQLのDSL(?)ですがqueryというキーが必要です。具体的にはペイロードには下記のようなデータを載せることになります。

1
{"query": "query { viewer { login } } ""

コード


これらをもとに Scala + Akka HTTP ClientでAPIを叩くとすると、下記のようなコードになると思います。なお、v4からは認証が必要なのでトークンをあらかじめ発行しておく必要があります。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import akka.actor.ActorSystem
import akka.http.scaladsl.Http
import akka.http.scaladsl.model._
import akka.http.scaladsl.model.headers.{Authorization, OAuth2BearerToken}
import akka.http.scaladsl.unmarshalling.Unmarshal
import akka.stream.ActorMaterializer

import scala.concurrent.ExecutionContext
import scala.util.{Failure, Success}

object HttpClient extends App {

implicit val actorSystem: ActorSystem = ActorSystem("githubv4apitest")
implicit val materializer: ActorMaterializer = ActorMaterializer()
implicit val executionContext: ExecutionContext = actorSystem.dispatcher

val request = HttpRequest(
HttpMethods.POST,
uri = Uri("https://api.github.com/graphql"),
headers = List(Authorization(OAuth2BearerToken(your_token))),
entity = HttpEntity(ContentTypes.`application/json`, "{\"query\":\"query{viewer{login}}\"")
)

for {
responseComplete <- Http().singleRequest(request)
response <- Unmarshal(responseComplete.entity).to[String]
} yield println(response)

}

上記を実行すると下記のような結果が表示されます。

1
{"data":{"viewer":{"login":"YoshinoriN"}}}

おまけ


curlバージョン。

1
2
curl -H "Authorization: token <yourtoken>" \
-X POST -d "{\"query\":\"query{viewer{login}}\"" https://api.github.com/graphql

まとめ


ドキュメントはちゃんと読みましょう。おわり。