🌐
GitHubのGraphQL APIにPythonを使ってアクセス
GraphQLを学ぶべく、GitHubのAPIを使って勉強しました。Pythonを使っています。
基本的な記述はこんな感じ。
query = """
query {
viewer {
name
repositories(last: 3) {
nodes {
name
}
}
}
}
"""
data = {'query': query}
# requestsモジュールを使ってPOSTします。
res = self.__post(self.endpoint, data)
しかしこの方法だと動的な値を与える事ができません。(今回で言う所のlast: 3
の部分)
なので変数variables
を使います。
query = """
query ($number_of_repos:Int!){
viewer {
name
repositories(last: $number_of_repos) {
nodes {
name
}
}
}
}
"""
variables = {
"number_of_repos": 3
}
data = {'query': query,
'variables': variables}
# requestsモジュールを使ってPOSTします。
res = self.__post(self.endpoint, data)
こうする事で動的に変わる値を変数として与える事ができます。
mutationとの組み合わせ
GitHubのサンプル
query FindIssueID {
repository(owner:"octocat", name:"Hello-World") {
issue(number:349) {
id
}
}
}
mutation AddReactionToIssue {
addReaction(input:{subjectId:"MDU6SXNzdWUyMzEzOTE1NTE=",content:HOORAY}) {
reaction {
content
}
subject {
id
}
}
}
まずはqueryで特定のissueIDを取得し、そのIDに対しリアクションをmutationするものとなります。
queryにはownerとnameの2つの値が必要なのですが、これもそのまま書くと不便なのでvariableを使います。
query = """
query($owner:String!, $name:String!) {
repository(owner: $owner, name: $name) {
issue(number:349) {
id
}
}
}
"""
variables = {
"owner": "octocat",
"name": "Hello-World"
}
data = {'query': query,
'variables': variables}
# requestsモジュールを使ってPOSTします。
res = self.__post(self.endpoint, data)
queryの中できちんと($owner:String!, $name:String!)
といった型を書いてあげないと失敗します。ちょっとここでハマりました。
そしてここで得たissueのidを使ってmutationを行い、リアクションを登録します。
query = """
query($owner:String!, $name:String!) {
repository(owner: $owner, name: $name) {
issue(number:349) {
id
}
}
}
"""
variables = {
"owner": "octocat",
"name": "Hello-World"
}
data = {'query': query,
'variables': variables}
# requestsモジュールを使ってPOSTします。
res = self.__post(self.endpoint, data)
query = """
mutation($input:AddReactionInput!) {
addReaction(input:$input) {
reaction {
content
}
subject {
id
}
}
}
"""
variables = {
"input": {
# queryで入手したidをsubjectIdとして登録
"subjectId": f"{res['data']['repository']['issue']['id']}",
"content": "HOORAY"
}
}
data = {'query': query,
'variables': variables}
# requestsモジュールを使ってPOSTします。
res = self.__post(self.endpoint, data)
こんな感じです。実行したら無事にリアクションが登録されました。やったね!
Discussion