API 逻辑差异
GitHub 提供两个 API:REST API 和 GraphQL API。有关 GitHub API 的更多信息,请参阅“比较 GitHub REST API 和 GraphQL API”。
从 REST 迁移到 GraphQL 代表着 API 逻辑的重大转变。REST 作为一种风格和 GraphQL 作为一种规范之间的差异,使得将 REST API 调用一一替换为 GraphQL API 查询变得困难,而且通常不可取。我们在下面包含了迁移的具体示例。
要将您的代码从 REST API 迁移到 GraphQL API
- 查看 GraphQL 规范
- 查看 GitHub 的 GraphQL 架构
- 考虑您当前拥有的任何现有代码如何与 GitHub REST API 交互
- 使用 全局节点 ID 在 API 版本之间引用对象
GraphQL 的主要优势包括
以下是每个示例。
示例:获取您需要的数据,仅此而已
单个 REST API 调用检索组织成员列表。
curl -v https://api.github.com/orgs/:org/members
如果您的目标是仅检索成员姓名和头像链接,则 REST 负载将包含过多数据。但是,GraphQL 查询仅返回您指定的内容。
query {
organization(login:"github") {
membersWithRole(first: 100) {
edges {
node {
name
avatarUrl
}
}
}
}
}
考虑另一个示例:检索拉取请求列表并检查每个拉取请求是否可合并。对 REST API 的调用将检索拉取请求列表及其摘要表示
curl -v https://api.github.com/repos/:owner/:repo/pulls
确定拉取请求是否可合并需要分别检索每个拉取请求以获取其详细表示(大型负载)并检查其mergeable
属性是否为真或假。
curl -v https://api.github.com/repos/:owner/:repo/pulls/:number
使用 GraphQL,您可以仅检索每个拉取请求的number
和mergeable
属性。
query {
repository(owner:"octocat", name:"Hello-World") {
pullRequests(last: 10) {
edges {
node {
number
mergeable
}
}
}
}
}
示例:嵌套
使用嵌套字段进行查询使您可以用更少的 GraphQL 查询替换多个 REST 调用。例如,使用 **REST API** 检索拉取请求及其提交、非审查评论和审查需要四个单独的调用。
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
}
}
}
}
}
}
您还可以通过替换拉取请求编号的变量来扩展此查询的功能。
示例:强类型
GraphQL 模式是强类型的,这使得数据处理更安全。
考虑使用 GraphQL变异向问题或拉取请求添加评论的示例,并错误地将整数而不是字符串指定为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
}
}
}
}
}