通过 HTTP 发送数据,许多开发人员已经在用 REST 了,而 GraphQL 通常被认为是一种代替遗留 REST API 的技术。本文将对比两者各自的优势、劣势以及它们之间的差异,希望能为你今后项目的技术选型提供帮忙。
什么是 REST?
REST(Representational state transfer,表述性状态转移) 是一种 API 设计架构,用于通过使用一组预定义的无状态操作(包括GET
、POST
、PUT
和DELETE
)来实现 Web 服务。
REST 的核心思想是,通过向资源的 URL 发送请求并获得响应(通常是 JSON,但这取决于 API)来检索资源。
REST 的优势
REST 是 可扩展的,因为它分离了客户端和服务端,因此我们可以轻松扩展应用程序。
灵活性 是使用 REST 的另一个优势,因为可以将其设计成处理不同类型的调用并返回不同的数据格式。
REST 的劣势
抓取过度——这是指 API 端点提供的信息比客户端所需要的要多得多。
抓取不足——这是指 API 端点并没有提供所需的全部信息。因此,客户端必须发出多个请求才能获取应用程序所需的全部内容。
什么是 GraphQL?
GraphQL 是一种 API 设计架构,它采用了不同的方法,在这种方法中,所有的东西都被视为一个表示其连接的图。这也意味着我们可以定制我们的请求,这样我们就可以从端点发出任何请求,并且能获得我们所请求的任何内容,仅此而已,无需更多操作。我们传递查询并得到响应。除此之外,它还允许我们将不同的实体组合到单个查询中。
GraphQL 的优势
检索精确的数据,无任何多余数据。在 GraphQL 中,可以得到我们所请求的内容,这是一个很大的优势。
客户端开发速度更快。通常,当数据需求发生变化时,我们只需修改查询,且无需太多的变更,因此可以快速进行产品迭代。客户端和服务端团队都可以独立工作,前提是他们都知道数据的结构。
GraphQL 的劣势
对于简单的应用程序来说,设置类型、查询等可能有点 复杂,因为使用 REST 可以很容易地完成。
它使用的是 单个端点,而不是遵循 HTTP 规范进行缓存。在网络级别进行缓存是很重要的,因为它可以减少到服务端的流量。
两者对比的简单示例
例如,我们正在显示用户的供稿,其中包含用户的帖子及其关注者的列表。在我们的例子中,我们必须显示该帖子的作者、帖子以及该用户的关注者。
如果使用 REST,我们至少要发出 2 到 3 个请求,类似于:
/user/<id>
以获得用户(作者)的详细信息,比如名称。/user/<id>/posts
获取该用户发布的帖子列表。/user/<id>/followers
以获取该用户的关注者列表。
但是在所有这些情况下,我们都过度抓取数据了。例如,在第一个请求中,我们只需要名称,但是当我们使用这种方法时,我们将会获取该用户相关的所有详细信息。
此时就是 GraphQL 显示其强大功能的时候了。我们需要指定查询,然后才能获得所需的输出。要使用 GraphQL 实现相同的效果,我们可以使用类似于这样的查询:
通过使用这样的查询,我们将能获得具有以下属性的 JSON 响应。简洁明了,不是吗?
GraphQL vs REST
总结一下,两者主要有如下几个明显的差异:
数据抓取
REST 会导致抓取过度或抓取不足,而 GraphQL 则不会这样。在 GraphQL 中,我们得到的就是我们所要求的。
对象定义(JSON 响应)
在 REST 中,我们可以在后端定义对象,而在 GraphQL 中,我们则要在前端定义该对象。
自动缓存
REST 能自动生效缓存,而 GraphQL 则没有自动缓存系统,但是可以借助 Apollo Client、Relay 等客户端实现缓存。
错误处理
REST 中的错误处理比 GraphQL 简单得多,GraphQL 通常会给我们一个 200 OK 的状态码,即使已经出现错误了。但是,当使用 Apollo Client、Relay 等客户端时,它也能很容易处理错误。
结论
与 REST 相比, GraphQL 当然更具优势,但它可能并不总是最佳实践。正如我前面所说的,是选择 REST 还是 GraphQL,取决于我们的应用程序。
希望本文能为大家在未来项目的技术选型中提供帮忙。如果大家想分享自己关于 GraphQL 或 REST 的经验,请在评论区留言,感谢您的阅读!
原文链接:
https://medium.com/javascript-in-plain-english/stop-using-rest-for-apis-d697727ae6dd
评论