前置知识: GitHub

REST与GraphQL-API

3 minAdvanced2026/6/14

GitHub API详解:REST API与GraphQL API的使用、认证与速率限制。

1. GitHub API 概述

1.1 两种 API

特性REST APIGraphQL API
端点多个固定端点单一端点
数据获取固定结构按需获取
请求次数可能需要多次通常一次
版本v3v4
基础 URLapi.github.comapi.github.com/graphql

2. 认证

2.1 Token

Token用途权限
Personal Access Token (Classic)个人使用全部权限
Personal Access Token (Fine-grained)个人使用细粒度权限
GitHub App Token应用集成按需授权
OAuth App Token第三方应用用户授权

2.2 创建 Token

  1. Settings → Developer settings → Personal access tokens
  2. 选择权限范围
  3. 生成并保存 Token

2.3 使用 Token

# REST API
curl -H "Authorization: token ghp_xxxxx" \
  https://api.github.com/user

# GraphQL API
curl -H "Authorization: bearer ghp_xxxxx" \
  -X POST -d '{"query": "{ viewer { login } }"}' \
  https://api.github.com/graphql

# 使用 gh CLI
gh api user

3. REST API

3.1 常用端点

操作方法端点
获取用户GET/user
列出仓库GET/user/repos
获取仓库GET/repos/{owner}/{repo}
列出 IssueGET/repos/{owner}/{repo}/issues
创建 IssuePOST/repos/{owner}/{repo}/issues
列出 PRGET/repos/{owner}/{repo}/pulls
创建 PRPOST/repos/{owner}/{repo}/pulls

3.2 示例

# 列出仓库
curl -H "Authorization: token ghp_xxxxx" \
  "https://api.github.com/user/repos?per_page=10&sort=updated"

# 创建 Issue
curl -X POST \
  -H "Authorization: token ghp_xxxxx" \
  -H "Content-Type: application/json" \
  -d '{"title":"Bug report","body":"Description","labels":["bug"]}' \
  https://api.github.com/repos/user/repo/issues

# 使用 gh CLI(推荐)
gh api repos/user/repo/issues \
  -f title="Bug report" \
  -f body="Description"

4. GraphQL API

4.1 基本查询

query {
  viewer {
    login
    repositories(first: 10, orderBy: { field: UPDATED_AT, direction: DESC }) {
      nodes {
        name
        description
        stargazerCount
      }
    }
  }
}

4.2 变更操作

mutation {
  createIssue(input: { repositoryId: "REPO_ID", title: "Bug report", body: "Description" }) {
    issue {
      number
      url
    }
  }
}

4.3 使用 gh CLI

gh api graphql -f query='
  query {
    viewer {
      login
      repositories(first: 5) {
        nodes { name }
      }
    }
  }
'

5. 速率限制

5.1 限制规则

API认证用户未认证
REST5,000 次/小时60 次/小时
GraphQL5,000 点/小时

5.2 检查剩余配额

# REST API
curl -I https://api.github.com/user
# X-RateLimit-Limit: 5000
# X-RateLimit-Remaining: 4999
# X-RateLimit-Reset: 1718342400

# GraphQL
gh api graphql -f query='{ rateLimit { remaining resetAt } }'

5.3 避免触发限制

  • 使用条件请求(ETag / If-Modified-Since)
  • 缓存 API 响应
  • 使用 GraphQL 减少请求次数
  • 使用 Webhooks 替代轮询

6. Webhooks vs API 轮询

方式优势劣势
Webhooks实时、高效需要服务器
API 轮询简单浪费配额
GraphQL 订阅实时实验性