我尝试了一下GraphQL
本文是《2017年Val实验室圣诞日历》第10天的文章。
触及之念初起
因为听说了Github API采用了GraphQL这一事实,然后在2017年的东京Node学園祭上参加了一场关于GraphQL的讲座,听到了一些优点,进而产生了兴趣。
GraphQL的优点
-
- 従来のREST APIであれば、複数回リクエストしなければ取得できないような情報を、GraphQLの場合は1回のリクエストで取得でき、通信が低コストで済む。
- REST APIの場合、リクエストすると提供者側が定義した情報がレスポンスにすべて含まれるが、GraphQLの場合は利用者側が欲しい要素だけを指定でき、必要な情報だけを取得できるため、レスポンスが適切な量になる。
听说有很多便利之处。
我这次尝试的内容
-
- GitHub上でマージされていない(Open)状態のプルリクエストをAPIで取得。
- 取得した内容をSlack上で通知させてみる。
我尝试创建一个查询。
一开始完全不了解,不知道怎么创建,感到困惑。但是尝试使用GitHub的GraphiQL(在浏览器上可以试用GraphQL的IDE),发现查询更容易试验和创建。(它还可以在执行之前检查是否有错误,非常方便。)
此外,我在“从REST迁移到GraphQL”页面上找到了有关v3 API(REST API)的GraphQL查询,并进一步了解了它。
这次的查询
我已经进行了更改,以便获取指定存储库中最新的10个处于”OPEN”状态的拉取请求的请求编号。
{
repository(owner: "${owner}", name: "${repo}") {
pullRequests(last: 10, states:[OPEN]) {
edges {
node {
number
}
}
}
}
}
(※请根据实际需要更改为想要参考的仓库的所有者名称和仓库名称。)
当您提交上述查询时,将会返回以下类似的数据响应。
{
"data": {
"repository": {
"pullRequests": {
"edges": [
{
"node": {
"number": 14
}
},
{
"node": {
"number": 16
}
},
{
"node": {
"number": 18
}
}
]
}
}
}
}
尝试通过Slack发送通知
我尝试将其转换为AWS Lambda函数,使用了Node.js。
(我已经将代码放在了下面的Gist中。)
https://gist.github.com/nakano348/1f927f0cb189de30683b27e019f8f794
因为graphql-request在使用GraphQL请求时非常方便,所以我正在尝试使用它。

当我尝试执行Lambda函数时,虽然相对低调,但我成功实现了像上述图片中展示的通知功能。
(关于通知消息,可以根据需要发送包含拉取请求链接的通知等,消息内容有改进的空间。)
概括
-
- 最初はどうやってクエリを作るのか戸惑うものの、GraphiQLで実際に触ってみると理解が捗る。
- 自分が指定した情報だけ返ってくるのというは、開発中に実際どんなデータが返ってきているのか内容を確認しやすくて便利に感じた。