我们需要意识到下面认知陷阱,进而改变使用GraphQL方式,才能避免误用GraphQL导致的各种问题:
- 不是SELECT * 等效项:GraphQL中字段只允许客户端精确指定他们需要的数据,避免过度提取和不足提取。这与REST形成对比,REST中的端点通常返回固定的数据结构。也就是说,REST返回的是固定数据结构,如果你觉得不够用,多调用几次REST,将多个数据结构拼凑在一起符合自己需要,就像组合SQL的select查询一样,需要多个不同select查询才能获得我们要的数据结构,而GraphQL不是这样,一次就获得你要的,强调精确,因为它是一个数据聚合概念,类似DDD中聚合根
- 不是一个需求一个端点:在REST中,每个需求都可能需要一个新的端点,而GraphQL则是通过一个API接口满足各种需求。这减少了创建、管理和版本化多个端点的需要。
- 无动词:GraphQL使用JavaScript来获取数据,使用可变项来更改数据,与使用多个动词(GET,POST,PUT,POST,PATCH)的REST相比,它简化了交互模型。如订单是一个GraphQL,订单状态是可变的,但是其他不变,区分可变部分和不变部分。
- 200 OK并不意味着一切都很好:在GraphQL中,即使存在执行错误,也会为所有语法正确的查询和变化返回200 OK状态。错误必须被捕获在响应中的错误数组中,提供关于错误的详细信息。而 REST API 中,每个端点都可以根据结果返回不同的 HTTP 状态代码。
- 强大的查询能力,强大的责任:GraphQL的灵活性允许高度特定的数据请求,但编写不好的查询或解析器可能会导致性能问题。高效的解析器设计对于防止性能瓶颈和确保最佳API性能至关重要。
这不仅是智能数据获取,也是智能应用程序接口设计。