REST和GraphQL是网络开发中两种主要的API设计模式。它们之间的选择影响API可用性、开发速度和维护复杂性。以下是诚实的框架。
REST是什么
表述性状态转移(REST)是一种API架构风格,其中资源表示为URL(端点),对这些资源的操作使用HTTP动词(GET、POST、PUT、DELETE、PATCH)。博客的REST API可能有:GET /articles(列出文章)、GET /articles/:id(单篇文章)、POST /articles(创建)、PUT /articles/:id(更新)、DELETE /articles/:id(删除)。REST是无状态的,自然使用HTTP缓存,并且人类可读。限制:需要跨多个资源特定字段组合的客户端发出多个请求,并接收比需要的更多(过度获取)或更少(获取不足)的数据。
GraphQL是什么
GraphQL(Facebook,2015年)是一种API查询语言,客户端在单个请求中精确指定它需要什么数据。GraphQL查询可能要求:用户名、他们最近3篇帖子的标题和日期、以及每篇帖子的评论数——所有这些在一次往返中完成。服务器精确返回那个结构。好处:没有过度获取、没有获取不足、通过模式强类型、自动API文档(模式就是文档)和减少API版本控制需求(你添加字段;旧客户端仍然工作)。成本:更复杂的服务器实现、查询深度攻击(恶意客户端可以编写指数级命中数据库的查询),以及缓存更难(对单个端点的POST请求没有额外工具不能受益于HTTP缓存)。
何时选择REST
选择REST用于:无法控制客户端的公共API、REST模型自然映射到操作的简单CRUD应用程序、HTTP缓存重要的系统(CDN缓存、公共读取密集型API)、不熟悉GraphQL的团队,以及服务间调用定义良好且相对稳定的微服务。REST也更容易测试和调试——标准HTTP工具(curl、浏览器)无需修改即可工作。
何时选择GraphQL
选择GraphQL用于:有多种需要不同数据形状的客户端类型的应用程序(网络、移动、电视应用都访问同一API)、获取效率重要的数据密集型应用程序、前端开发者想要快速移动而不等待后端端点更改的产品导向团队,以及当你已经有一个清晰映射到模式的定义良好的数据模型时。GitHub、Shopify、Twitter和大多数大型消费科技公司已经将他们的公共API迁移到GraphQL用于合作伙伴集成。GraphQL最常见的错误:在REST本来更简单且足够的简单内部CRUD API上使用它。




