【问题标题】:Projects where REST is more suitable over GraphQL? [closed]REST 比 GraphQL 更适合的项目? [关闭]
【发布时间】:2017-04-01 22:50:43
【问题描述】:

根据我阅读的文章,GraphQL 在往返方面更节省资源,并且它还可以完成 REST 可以提供的功能。考虑到 Web 应用程序将从头开始,软件架构师和开发人员可能决定继续使用 REST 而不是 GraphQL 的原因是什么?此外,鉴于这是一个持续的项目,将从 Web 和移动端使用,并且需要 openID 连接。

【问题讨论】:

标签: rest web-applications architecture graphql


【解决方案1】:

在我看来,除其他方面外,这也是用例的问题:

  • 如果您的应用程序或其他前端的连接速度很慢和/或延迟较高(典型示例:移动应用程序),那么 GraphQL 的“往返最小化”可能是一大优势。让客户端控制数据结构非常方便,因此通常会减少所需 API 端点的数量。
  • 如果它是服务器之间的数据交换,那么 RESTful API 与 HTTP 密切相关这一事实具有诸如动词语义(GraphQL 无法提供,因为您使用一个 GraphQL 查询执行多个操作)和状态代码等优点。另外:您可以免费获得所有 HTTP 缓存功能,这在大量数据驱动的应用程序/服务中非常重要。此外,REST 无处不在(尽管可能大多数标榜为“RESTful”的 API 并非如此,这通常是因为缺少对超媒体的支持)。

【讨论】:

  • 一般问题:鉴于 spring 已经为 oauth2(授权和资源服务器)+ hatoas 提供了入门代码,客户端代码将在 react...rest 仍然比使用 graphql 开发更快?跨度>
  • 对我们来说,GraphQL 在开发时比传统的 REST 解决方案(如 .NET 或 Spring 中的 WebAPI)快得多。但这对于每个开发者来说仍然是很主观的。
【解决方案2】:

这是一个相当广泛的问题,但我会尝试根据自己的经验回答。

REST 提供对特定资源的访问,例如用户或产品。请求的结果可能是您想要或使用什么数据的假设,即无论您是否使用所有数据,它都可能是关于该资源的一切。

还有N+1的问题。以用户拥有并属于多关系场景为例;使用 RESTful API,您可以向用户发出请求,例如/users/:id 然后向他们的所有关系发出请求,例如/users/:id/relationships,这已经是两个请求了。可能存在关系端点的假设,以在结果数组中包含关系(朋友、家人等)和用户,但如果 API 不这样做 假设,您将不得不向每个用户端点发出请求,以获取每个关系中每个用户的数据。

这个例子也可以更深入;如果您想要所有二级关系(例如朋友的朋友)怎么办?

GraphQL 解决了这个问题,它允许您明确提出您的需求。您可以构造一个查询以深入返回数据:

query myQuery($userId: ID!) {
  user(id: $userID) {
    id
    name
    relationships {
      id
      type
      user {
        id
        name
        relationships {
          id
          type
          user {
            id
            name
          }
        }
      }
    }
  }
}

片段可以稍微清理一下,并且可能存在递归问题,但您应该明白这一点;一个请求即可获得所需的所有嵌套数据。

如果您不太需要这种嵌套或相互连接的结果集,那么 GraphQL 可能无法在收益和复杂性之间进行权衡。

但是,我发现 GraphQL 的最大好处之一是它的可扩展性和自文档化。

【讨论】:

  • 我忘了说openID connect是必须的,这会是决定选择哪一个的因素吗?对于 REST,我们可以限制某个 access_token 可以访问的端点,这在 graphql 中怎么样?
  • @lem 有两种方法:首先是在 GraphQL 端点上进行身份验证,就像您通常对任何 RESTful 端点所做的那样。第二个是将经过身份验证的用户作为上下文传递到每个查询/变异中,并确保用户可以访问给定的资源。这是一种由内而外的身份验证方法,您首先加载资源,然后检查是否允许用户读取/写入所述资源。使用 REST/CRUD 更容易,因为您可以基于操作而不是资源本身进行身份验证。
【解决方案3】:

可能有多种原因。我相信这是非常主观的,但对我来说这是基于:

REST 是古老而稳定的方式。它被大多数人使用,并为 API 消费者提供了一个简单的接口。因为它很旧(绝不是坏事),所以大多数开发人员都知道它并且知道如何使用它。

GraphQL 是镇上的新人。它确实为大多数系统节省了一些性能(往返和有效负载),但确实改变了我们对后端的看法。它不提供资源端点,而是提供数据模型的图,并让消费者决定要获取哪些数据。

就“新人”而言,GraphQL 还没有经过实战考验。它对大多数人来说是新的,因此基本上没有被其他人、先行者和初创公司采用。

但同样,这是一个带有主观答案的主观问题。目前我正在为一家初创公司使用 GraphQL 来测试它的耐用性,看看它是否能解决我们的需求。到目前为止,它确实如此。如果您要决定是否使用 REST 或 GraphQL 开始一个新项目,您应该考虑您的需求以及您希望花费多少金钱/时间来学习新事物,而不是做您所知道的事情并更快地实现您的目标。

【讨论】:

  • Graphql 如果我们有时间并且我们追求性能?顺便说一句,oauth2.0/openID connect 是一样的吗?
  • 嗯,是的。使用 GraphQL 可以提高性能。此外,GraphQL 没有指定任何身份验证方法,因此请按照您通常的做法进行。
猜你喜欢
  • 1970-01-01
  • 2017-04-29
  • 1970-01-01
  • 2020-08-24
  • 2023-04-08
  • 2010-10-30
  • 2014-08-11
  • 2011-02-21
相关资源
最近更新 更多