APIã®ããžãã¯ã«é¢ããå·®ç°
GitHub ã«ã¯ãREST API ãš GraphQL API ãšãã 2 ã€ã® API ãçšæãããŠããŸãã GitHub ã® API ã®è©³çްã«ã€ããŠã¯ããGitHub ã® REST API ãš GraphQL API ã®æ¯èŒããåç §ããŠãã ããã
RESTããGraphQLãžã®ç§»è¡ã¯ãAPIããžãã¯ã®å€§ããªå€åã瀺ããŸãã ã¹ã¿ã€ã«ãšããŠã® REST ãšä»æ§ãšããŠã® GraphQL ãšã®éãã®ããã«ãREST API ã®åŒã³åºãã GraphQL API ã®ã¯ãšãªã« 1 察 1 ã§çœ®ãæããããšã¯é£ãããâãã°ãã°æãŸãªãâçµæã«ãªããŸãã ç§»è¡ã®å ·äœçãªäŸã以äžã«ç€ºããŸããã
ã³ãŒãã REST API ãã GraphQL API ã«ç§»è¡ããã«ã¯ã以äžãè¡ããŸãã
- GraphQL 仿§ã確èªãã
- GitHub ã® GraphQL ã¹ããŒãã確èªãã
- çŸåšã®ã³ãŒãã«ããGitHub REST APIãšã®ãããšãã®èæ ®
- ã°ããŒãã« ããŒã ID ã䜿çšã㊠API ããŒãžã§ã³éã§ãªããžã§ã¯ããåç §ãã
GraphQLã«ããéèŠãªå©ç¹ã«ã¯ä»¥äžããããŸãã
- å¿ èŠãšããããŒã¿ã ããååŸã§ãã
- å ¥ãåã«ãªã£ããã£ãŒã«ã
- 匷ãåä»ã
以äžã«ããããã®äŸã瀺ããŸãã
äŸïŒå¿ èŠãªããŒã¿ã ããååŸ
1ã€ã®REST APIåŒã³åºãã§ãOrganizationã®ã¡ã³ããŒã®ãªã¹ããååŸããŸãã
curl -v https://api.github.com/orgs/:org/members
ç®çãã¡ã³ããŒåãšã¢ãã¿ãŒãžã®ãªã³ã¯ã®ååŸã ããªã®ã§ããã°ããã®RESTã®ãã€ããŒãã«ã¯éå°ãªããŒã¿ãå«ãŸããŠããŸãã ããããGraphQLã®ã¯ãšãªã§ã¯æå®ããå 容ã ããè¿ãããŸãã
query {
organization(login:"github") {
membersWithRole(first: 100) {
edges {
node {
name
avatarUrl
}
}
}
}
}
å¥ã®äŸãèããŠã¿ãŸãããããã«ãªã¯ãšã¹ãã®ãªã¹ããååŸããŠããããããããŒãžå¯èœãããã§ãã¯ããŸãã REST API ãåŒã³åºããšãpull request ãšãã® æŠèŠè¡šçŸã®äžèЧãååŸãããŸãã
curl -v https://api.github.com/repos/:owner/:repo/pulls
pull request ãããŒãžå¯èœãã倿ããã«ã¯ãåå¥ã«ããããã® pull request ã®è©³çްãªè¡šçŸ (倧ããªãã€ããŒã) ãååŸãããã® mergeable
屿§ã true ã false ãããã§ãã¯ããå¿
èŠããããŸãã
curl -v https://api.github.com/repos/:owner/:repo/pulls/:number
GraphQL ã§ã¯ãå pull request ã® number
屿§ãš mergeable
屿§ã®ã¿ãååŸã§ããŸãã
query {
repository(owner:"octocat", name:"Hello-World") {
pullRequests(last: 10) {
edges {
node {
number
mergeable
}
}
}
}
}
äŸïŒå ¥ãå
å ¥ãåã«ãªã£ããã£ãŒã«ãã«ã¯ãšãªãè¡ãããšã§ãè€æ°ã®RESTã®åŒã³åºããå°æ°ã®GraphQLã¯ãšãªã«çœ®ãæããããŸãã ããšãã°ãREST API ã䜿ã£ãŠãã³ããããéã¬ãã¥ãŒ ã³ã¡ã³ããã¬ãã¥ãŒãšäžç·ã« pull request ãååŸããã«ã¯ã4 ã€ã®å¥ã ã®åŒã³åºããå¿ èŠã«ãªããŸãã
curl -v https://api.github.com/repos/:owner/:repo/pulls/:number
curl -v https://api.github.com/repos/:owner/:repo/pulls/:number/commits
curl -v https://api.github.com/repos/:owner/:repo/issues/:number/comments
curl -v https://api.github.com/repos/:owner/:repo/pulls/:number/reviews
GraphQL API ã䜿ãã°ãå ¥ãåã®ãã£ãŒã«ããå©çšããŠåäžã®ã¯ãšãªã§ãã®ããŒã¿ãååŸã§ããŸãã
{
repository(owner: "octocat", name: "Hello-World") {
pullRequest(number: 1) {
commits(first: 10) {
edges {
node {
commit {
oid
message
}
}
}
}
comments(first: 10) {
edges {
node {
body
author {
login
}
}
}
}
reviews(first: 10) {
edges {
node {
state
}
}
}
}
}
}
pull request çªå·ã® 倿°ã眮ãæããããšã§ããã®ã¯ãšãªã®æ©èœãæ¡åŒµããããšãã§ããŸãã
äŸïŒåŒ·åãªåä»ã
GraphQLã¹ããŒãã¯åŒ·ãåä»ããããŠãããããŒã¿ã®æ±ããå®å šã«ãªã£ãŠããŸãã
GraphQL ãã¥ãŒããŒã·ã§ã³ã䜿çšããŠåé¡ãŸã㯠pull request ã«ã³ã¡ã³ãã远å ããclientMutationId
ã®å€ã«æååã§ã¯ãªãæŽæ°ã誀ã£ãŠæå®ããäŸãèããŠã¿ãŸãããã
mutation {
addComment(input:{clientMutationId: 1234, subjectId: "MDA6SXNzdWUyMjcyMDA2MTT=", body: "Looks good to me!"}) {
clientMutationId
commentEdge {
node {
body
repository {
id
name
nameWithOwner
}
issue {
number
}
}
}
}
}
ãã®ã¯ãšãªãå®è¡ãããšããã®æäœã«æåŸ ãããåãæå®ãããšã©ãŒãè¿ãããŸãã
{
"data": null,
"errors": [
{
"message": "Argument 'input' on Field 'addComment' has an invalid value. Expected type 'AddCommentInput!'.",
"locations": [
{
"line": 3,
"column": 3
}
]
},
{
"message": "Argument 'clientMutationId' on InputObject 'AddCommentInput' has an invalid value. Expected type 'String'.",
"locations": [
{
"line": 3,
"column": 20
}
]
}
]
}
ã¯ãªãŒãã§ 1234
ãã©ãããããšããã®å€ãæŽæ°å€ããæåŸ
ãããŠããåã§ããæååã«å€æã§ããŸãã
mutation {
addComment(input:{clientMutationId: "1234", subjectId: "MDA6SXNzdWUyMjcyMDA2MTT=", body: "Looks good to me!"}) {
clientMutationId
commentEdge {
node {
body
repository {
id
name
nameWithOwner
}
issue {
number
}
}
}
}
}