{"meta":{"title":"比较GitHub的 REST API 和 GraphQL API","intro":"了解 GitHub 的 API，以扩展和自定义你的 GitHub 体验。","product":"REST API","breadcrumbs":[{"href":"/zh/rest","title":"REST API"},{"href":"/zh/rest/about-the-rest-api","title":"REST API 简介"},{"href":"/zh/rest/about-the-rest-api/comparing-githubs-rest-api-and-graphql-api","title":"比较GitHub的 API"}],"documentType":"article"},"body":"# 比较GitHub的 REST API 和 GraphQL API\n\n了解 GitHub 的 API，以扩展和自定义你的 GitHub 体验。\n\n## 关于 GitHub 的 API\n\nGitHub 提供两个 API：REST API 和 GraphQL API。 可以使用 GitHub CLI、curl、官方 Octokit 库和第三方库与这两个 API 进行交互。 有时，某个功能可能受一个 API 支持，但不受另一个 API 支持。\n\n您应该使用最符合您需求并且您使用起来最得心应手的 API。 无需只使用一个 API 而不使用另一个。 使用节点 ID，可在 REST API 和 GraphQL API 之间移动。 有关详细信息，请参阅“[使用全局节点 ID](/zh/graphql/guides/using-global-node-ids)”。\n\n本文介绍每个 API 的优点。 有关 GraphQL API 的详细信息，请参阅 [关于 GraphQL API](/zh/graphql/overview/about-the-graphql-api)。 有关 REST API 的详细信息，请参阅 [REST API 简介](/zh/rest/about-the-rest-api/about-the-rest-api)。\n\n## 选择 GraphQL API\n\nGraphQL API 准确返回所请求的数据。 GraphQL 还会根据请求以已知结构返回数据。 相比之下，REST API 返回的数据比请求的数据多，并采用预先确定的结构来返回。 还可以通过单个 GraphQL 请求完成等效的多个 REST API 请求。 使用 GraphQL，可减少发出的请求数和提取的数据，这使得其对于移动应用程序开发人员极具吸引力。\n\n例如，若要获取你的 10 个关注者的 GitHub 登录名，以及其中每个关注者的 10 个关注者的登录名，可以发送一个如下所示的请求：\n\n```graphql\n{\n  viewer {\n    followers(first: 10) {\n      nodes {\n        login\n        followers(first: 10) {\n          nodes {\n            login\n          }\n        }\n      }\n    }\n  }\n}\n```\n\n响应将是遵循请求结构的 JSON 对象。\n\n相比之下，若要通过 REST API 获取相同的信息，需要首先向 `GET /user/followers`发出请求。 该 API 将返回每个关注者的登录名，以及关于关注者的其他不需要的数据。 然后，对于每个关注者，需要向 `GET /users/{username}/followers`发出请求。 总共需要发出 11 个请求才能获取可通过单个 GraphQL 请求获取的相同信息，并且会收到多余的数据。\n\n## 选择 REST API\n\n由于 REST API 的存在时间比 GraphQL API 长，因此一些开发人员更熟悉 REST API。 由于 REST API 使用标准 HTTP 谓词和概念，因此许多开发人员已经熟悉使用 REST API 的基本概念。\n\n例如，若要在 `octocat/Spoon-Knife` 存储库中创建问题，需要使用 JSON 请求正文向 `POST /repos/octocat/Spoon-Knife/issues` 发送请求：\n\n```json\n{\n  \"title\": \"Bug with feature X\",\n  \"body\": \"If you do A, then B happens\"\n}\n```\n\n相比之下，若要使用 GraphQL API 发出问题，需要获取 `octocat/Spoon-Knife` 存储库的节点 ID，然后发送如下请求：\n\n```graphql\nmutation {\n  createIssue(\n    input: {\n      repositoryId: \"MDEwOlJlcG9zaXRvcnkxMzAwMTky\"\n      title: \"Bug with feature X\"\n      body: \"If you do A, then B happens\"}\n  ) {\n    issue {\n      number\n      url\n    }\n  }\n}\n```"}