GraphQL API 设计指南:最佳实践

本文介绍 GraphQL API 设计的最佳实践和技巧,帮助读者创建可扩展、灵活和高效的 API。

用 Apifox,节省研发团队的每一分钟

GraphQL API 设计指南:最佳实践

免费使用 Apifox

相关推荐

最新文章

API

一体化协作平台

API 设计

API 文档

API 调试

自动化测试

API Mock

API Hub

立即体验 Apifox
目录

GraphQL API 设计 思考

GraphQL 

对于 GraphQL API 的设计,我个人觉得要遵守两条重要的准则:

  • 向后兼容旧版本
  • 向前考虑拓展性

向后兼容旧版本

向后兼容旧版本是非常重要的,在平时的开发中,大家还是得遵守这一准则。

接口的兼容性,我觉得是一个开发在每次开发的时候一定要考虑到的,因为很多用户还在使用着旧版本,一定要把他们考虑进来。虽然说想要做到这一点,会增加开发成本,但我觉得这是非常有必要的,总不能等到上线了,出现了旧版本的问题,再一个一个去解决吧,那效率就非常低了。

如果不兼容旧版本,那么用户使用旧版本的时候会出现查询失败等报错,导致老用户流失,所以原则上,新功能不能影响原有的功能,所以需要去兼容它。

向前考虑拓展性

无论是接口还是函数,拓展性一直是一个基本的原则,拓展性是一个函数好不好的重要判定标准。在 GraphQL 的查询中,我觉得要实行 ORM 那种对象配置的查询方式,这样的话方便后面查询的拓展,增加这个 API 的可能性。

不使用自定义的对象类型,还会使得参数列表随着迭代变得越来越长,而一个长的参数列表,又是另一种代码坏味道。

GraphQL API 设计细节

命名

命名采用 动词+名词 的形式,比如:

  • 新增用户:addUser
  • 删除用户:removeUser
  • 修改用户:editUser

传参

我们需要考虑兼容性,以及拓展性。所以需要我们要保证传参的基本结构是不变的,这样才能兼容旧版本,同时,也可以往这个对象中去新增属性,保证了后续的传参拓展。

返回结果

需要将涉及到的 Response 都进行返回,这样一次性返回的数据多,就不需要多几次请求了,能降低前端请求频率,大大提高前端请求的效率。

单一端点

我们在使用 REST,可能十个请求会有十个 URL ,但是再 GraphQL 中不要这么做,这么做的话就违反了 GraphQL 本身的规范了。我们可以只用一个 URL ,通过传递不同的查询条件,去得到不同的结果。市面上很多 GraphQL 的库也是遵循了这个规则。

gzip 压缩 JSON

在响应头中加上:

Accept-Encoding: gzip

就可以对返回的响应进行压缩,减少返回的体积,提高获取数据的速度。

可空性

在传递 GraphQL 参数的时候,有些字段要允许可空,这样做的理由是,不能因为查不到某一个字段,就影响了整体的数据查询,这样的话我们的查询会变得寸步难行,效率极低。

分页

由于 GraphQL 不能对未知深度的数据进行全量查询,所以我们在设计 GraphQL 列表接口的时候,需要做好分页这一工作。

分页

Apifox 测试 GraphQL 接口

GraphQL API 还有一个重要的环节,那就是当你编写完一个 GraphQL 接口后,需要去进行调试,看看这个接口返回的数据是否符合你的预期

给大家推荐一款超级好用、支持中文、免费的 API 工具 —— Apifox

新建 GraphQL 请求

我们调试之前,需要新建一个 GraphQL 请求,这是前置条件。

新建 GraphQL 请求

设置断言

我们需要判断查询的数据是不是符合我们的预期,我们可以使用 Apifox 提供的可视化断言功能,不需要你写脚本,直接用就完事了。

可视化断言

填入断言的信息:

  • 断言名称
  • JSON PATH 表达式
  • 断言条件

这个断言意思就是,返回数据的 data->questionById->id 是否等于后面那串数字。

设置断言

设置完,点击 保存 按钮。

运行 查看校验结果

我们到运行也,点击 发送按钮,我们发现断言成功了,也就是返回的数据是我们预期的:

运行 查看校验结果

这就完成了 Apifox 对于一个 GraphQL 接口的调试。

关于Apifox

  • 集成了API 文档、API 调试、API Mock、API 自动化测试 API 一体化协作平台
  • 拥有更先进的 API 设计/开发/测试工具
  • Apifox = Postman + Swagger + Mock + JMeter
Apifox 官网

欢迎体验一下,完全免费的哦:在线使用 Apifox