什么是GraphQL?
GraphQL是一种开源的API查询语言,最初由Facebook于2012年开发,并于2015年公开发布。它提供了一种灵活高效的替代方案,解决了传统REST API中常见的过度获取和不足获取问题,允许客户端仅请求所需的特定数据。
GraphQL日益受欢迎的原因之一是其以客户端驱动的特性。这使其尤其适合现代应用程序,在这些应用程序中,性能、可扩展性和无缝用户体验至关重要。GraphQL使客户端能够将多个资源合并为一个请求,从而减少网络流量,并为带宽有限或前端需求复杂的移动应用提供了出色的解决方案。
像GitHub、Twitter、Indeed和Shopify等主要公司都采用了GraphQL,突出了它在简化API开发和改善客户端-服务器交互方面的潜力。
GraphQL接口
在GraphQL中,接口的功能类似于面向对象编程中的接口。它是一种抽象类型,定义了一组多个对象类型可以实现的共同字段。这确保了客户端可以在不同类型之间自信地查询这些共同字段。
type Query {
findVehicles(): [Vehicle!]!
}
interface Vehicle {
id: ID!
name: String!
model: String
}
type Car implements Vehicle {
id: ID!
name: String!
model: String
# Specific to Car
fuelType: String!
}
type Bicycle implements Vehicle {
id: ID!
name: String!
model: String
# Specific to Bicycle
gearCount: Int!
isElectric: Boolean!
}
GraphQL客户端查询:
query findVehicles() {
findVehicles() {
vehicle {
id,
name,
model,
... on Car {
fuelType
}
... on Bicycle {
gearCount,
isElectric
}
}
}
}
在这个例子中,像 id
、name
和 model
这样的公共字段在实现 Vehicle
接口的所有对象类型中都是可用的。然而,特定类型的字段,例如 Car
的 fuelType
和 Bicycle
的 gearCount
及 isElectric
可以使用片段进行查询。
如果客户端只需要公共字段,他们可以省略片段:
query findCars() {
findCars() {
car {
id,
name,
model
}
}
}
使用接口的好处
- 代码重用性:公共字段可以在接口中定义并在多个类型之间共享,从而减少冗余。
- 简化客户端逻辑:客户端无需对对象类型进行条件检查。他们可以请求确切的类型并自信地处理响应。
- 模式可扩展性:添加一个新的公共字段变得更容易,因为它只需在接口中定义即可。
- 强制结构:接口强制所有实现类型之间共享结构,确保一致性(例如,所有车辆必须具有
id
、name
和model
)。 - 统一查询:客户端可以查询单一接口,以从所有实现类型中检索数据,而不是单独查询不同的类型。
- 改善文档:通过接口定义公共行为,使得 API 使用者更容易理解和处理相关类型。
GraphQL 联合
在GraphQL中,联合是一种抽象类型,允许客户端通过单个字段查询多个在某种方面相关的对象类型。与接口不同,联合不要求成员类型共享公共字段。这使得联合非常适合处理相关类型具有不同结构但需要一起查询的情况。
type Query {
getPurchaseItems(): [PurchaseItem!]!
}
union PurchaseItem = Product | Service | Subscription
type Product {
id: ID!
productName: String!
price: Float!
}
type Service {
id: ID!
serviceName: String
duration: Float
}
type Subscription {
id: ID!
planName: String
billingCycle: String
}
GraphQL客户端查询:
query getPurchaseItems() {
getPurchaseItems() {
purchaseItems {
... on Product {
id
productName
price
}
... on Service {
id
serviceName
duration
}
... on Subscription {
id
planName
billingCycle
}
}
}
}
在这个例子中,Product、Service和Subscription都是属于PurchaseItem联合的不同类型。客户端可以使用片段在一个查询中查询这三种类型,即使它们不共享任何字段。
关于联合的重要说明,联合类型的成员类型必须都是对象基本类型;标量、接口和联合类型不能是联合的成员类型。类似地,包装类型也不能是联合的成员类型。
使用联合的好处
- 灵活分组:联合允许查询没有共享公共字段的相关类型,否则处理起来会很麻烦。
- 简化错误处理:客户端可以使用片段查询特定类型,从而减少对客户端复杂条件逻辑的需求。
- 异构数据处理:一个查询可以从多个类型中检索数据,简化了对不同数据结构的处理。
- 错误响应的实用性:当您想将成功响应和错误详细信息合并为单一响应类型时,联合特别有用,这使得客户端能够高效处理它们。
总结
:GraphQL 接口和联合为构建 GraphQL 架构提供了强大的方式,增强了灵活性并简化了客户端与服务器之间的交互。接口允许跨类型共享字段,促进代码重用和更轻松的架构扩展。而联合则提供了一种查询不同类型的方法,无需共同字段。
Source:
https://dzone.com/articles/a-beginners-guide-to-graphql-interfaces-and-unions