如何解决GraphQL抓取不足或过度抓取

GraphQL是一个强大的API设计工具,并提供了一些优于传统REST API的优势。但是GraphQL存在抓取不足或过度抓取

我们需要意识到下面认知陷阱,进而改变使用GraphQL方式,才能避免误用GraphQL导致的各种问题:

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

这不仅是智能数据获取,也是智能应用程序接口设计。