GraphQL

描述你的数据

type Project {
  name: String
  tagline: String
  contributors: [User]
}

请求你想要的

{
  project(name: "GraphQL") {
    tagline
  }
}

得到可预测的结果

{
  "project": {
    "tagline": "A query language for APIs"
  }
}
马上开始

用于 API 的查询语言

GraphQL 是一个用于 API 的查询语言,也是使用现有数据完成这些查询的运行时。 GraphQL 为 API 中的数据提供了完整且易于理解的描述,使客户能够准确地询问他们需要的内容,从而更轻松地随着时间的推移改进 API,并启用强大的开发工具。

请求你需要什么,
准确地得到

向你的 API 发送 GraphQL 查询并获取您所需要的内容,不多也不少。 GraphQL 查询始终返回可预测的结果。 使用 GraphQL 的应用快速且稳定,因为它们控制所获取的数据,而不是服务器。

在单个请求中
获取多个资源

GraphQL 查询不仅访问一个资源的属性,还可以顺利地跟踪它们之间的引用。 虽然典型的 REST API 需要从多个 URL 加载,但 GraphQL API 可以在单个请求中获取应用所需的所有数据。 即使在缓慢的移动网络连接上,使用 GraphQL 的应用也可以很快。

使用类型系统
描述可能性

GraphQL API 是根据类型和字段而不是端点来组织的。 从单个端点访问数据的全部功能。 GraphQL 使用类型来确保应用只询问可能的情况并提供清晰且有用的错误。 应用可以使用类型来避免编写手动解析代码。

无需版本
即可改进你的 API

向 GraphQL API 添加新字段和类型,而不影响现有查询。 老字段可以弃用并在工具中隐藏。 通过使用单一的演进版本,GraphQL API 使应用能够持续访问新功能,并鼓励使用更干净、更易于维护的服务器代码。

带上自己的 数据和代码

GraphQL 在整个应用中创建统一的 API,而不受特定存储引擎的限制。 编写 GraphQL API,利用你现有的数据和代码以及多种语言提供的 GraphQL 引擎。 你为类型系统中的每个字段提供函数,GraphQL 以最佳并发性调用它们。

  • GraphQL
    type Character {
      name: String
      homeWorld: Planet
      friends: [Character]
    }
  • JavaScript
    // type Character {
    class Character {
      // name: String
      getName() {
        return this._name
      }
      // homeWorld: Planet
      getHomeWorld() {
        return fetchHomeworld(this._homeworldID)
      }
      // friends: [Character]
      getFriends() {
        return this._friendIDs.map(fetchCharacter)
      }
    }
  • Python
    # type Character {
    class Character:
      # name: String
      def name(self):
        return self._name
     
      # homeWorld: Planet
      def homeWorld(self):
        return fetchHomeworld(self._homeworldID)
     
      # friends: [Character]
      def friends(self):
        return map(fetchCharacter, self._friendIDs)
  • C Sharp
    // type Character {
    public class Character {
      // name: String
      public String Name { get; }
     
      // homeWorld: Planet
      public async Task<Planet> GetHomeWorldAsync() {
        return await FetchHomeworldAsync(_HomeworldID);
      }
     
      // friends: [Character]
      public async IEnumerable<Task<Character>> GetFriendsAsync() {
        return _FriendIDs.Select(FetchCharacterAsync);
      }
    }
  • GraphQL
    type Character {
      name: String
      homeWorld: Planet
      friends: [Character]
    }
  • JavaScript
    // type Character {
    class Character {
      // name: String
      getName() {
        return this._name
      }
      // homeWorld: Planet
      getHomeWorld() {
        return fetchHomeworld(this._homeworldID)
      }
      // friends: [Character]
      getFriends() {
        return this._friendIDs.map(fetchCharacter)
      }
    }
  • Python
    # type Character {
    class Character:
      # name: String
      def name(self):
        return self._name
     
      # homeWorld: Planet
      def homeWorld(self):
        return fetchHomeworld(self._homeworldID)
     
      # friends: [Character]
      def friends(self):
        return map(fetchCharacter, self._friendIDs)
  • C Sharp
    // type Character {
    public class Character {
      // name: String
      public String Name { get; }
     
      // homeWorld: Planet
      public async Task<Planet> GetHomeWorldAsync() {
        return await FetchHomeworldAsync(_HomeworldID);
      }
     
      // friends: [Character]
      public async IEnumerable<Task<Character>> GetFriendsAsync() {
        return _FriendIDs.Select(FetchCharacterAsync);
      }
    }