type Project {
name: String
tagline: String
contributors: [User]
}
{
project(name: "GraphQL") {
tagline
}
}
{
"project": {
"tagline": "A query language for APIs"
}
}
GraphQL 是一个用于 API 的查询语言,也是使用现有数据完成这些查询的运行时。 GraphQL 为 API 中的数据提供了完整且易于理解的描述,使客户能够准确地询问他们需要的内容,从而更轻松地随着时间的推移改进 API,并启用强大的开发工具。
向你的 API 发送 GraphQL 查询并获取您所需要的内容,不多也不少。 GraphQL 查询始终返回可预测的结果。 使用 GraphQL 的应用快速且稳定,因为它们控制所获取的数据,而不是服务器。
GraphQL 查询不仅访问一个资源的属性,还可以顺利地跟踪它们之间的引用。 虽然典型的 REST API 需要从多个 URL 加载,但 GraphQL API 可以在单个请求中获取应用所需的所有数据。 即使在缓慢的移动网络连接上,使用 GraphQL 的应用也可以很快。
GraphQL API 是根据类型和字段而不是端点来组织的。 从单个端点访问数据的全部功能。 GraphQL 使用类型来确保应用只询问可能的情况并提供清晰且有用的错误。 应用可以使用类型来避免编写手动解析代码。
向 GraphQL API 添加新字段和类型,而不影响现有查询。 老字段可以弃用并在工具中隐藏。 通过使用单一的演进版本,GraphQL API 使应用能够持续访问新功能,并鼓励使用更干净、更易于维护的服务器代码。
GraphQL 在整个应用中创建统一的 API,而不受特定存储引擎的限制。 编写 GraphQL API,利用你现有的数据和代码以及多种语言提供的 GraphQL 引擎。 你为类型系统中的每个字段提供函数,GraphQL 以最佳并发性调用它们。
type Character {
name: String
homeWorld: Planet
friends: [Character]
}
// 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)
}
}
# 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)
// 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);
}
}
type Character {
name: String
homeWorld: Planet
friends: [Character]
}
// 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)
}
}
# 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)
// 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);
}
}