GraphQL和Fieldings REST约束

问题描述 投票:0回答:1

在他的dissertation中,Fielding定义了一组应该满足REST API的规则。

这包括以下规则:

  • 客户端服务器
  • 无状态缓存接口
  • 统一合同(超媒体或HATEOAS,......)
  • 分层系统

是否可以使用GraphQL满足这些要求?

虽然点客户端 - 服务器,无状态和分层系统可能已经完成,但我不确定点缓存和统一合同。

rest client-server graphql distributed-system
1个回答
4
投票

让我们通过Fieldings约束并检查GraphQL是否满足它们:

客户端 - 服务器架构 - 是

GraphQL(主要)是一种查询语言,指定从客户端到服务器的查询。

无国籍 - 是的

这将在qazxsw poi中详细讨论。简短的回答是肯定的,GraphQL是无状态的,因为没有会话概念,服务器不需要任何额外的信息来处理请求。

可缓存性 - 没有

这个比较棘手。从技术上讲,您可以在HTTP请求级别上缓存GraphQL查询(如果您使用here)。但是,由于客户端可以查询对象和属性的任意组合,因此这种高速缓存的命中率可能很低,并且高速缓存的信息高度冗余。因此,GraphQL开发人员建议使用use HTTP。然而,这种方法需要全局唯一标识符,在GraphQL规范之上引入了额外的约束,这可能类似于REST的“资源标识”约束(见下文)。

另一种选择是将缓存推迟到向GraphQL服务器提供数据的其他组件,但这与GraphQL本身无关。鉴于上述情况,我认为默认情况下GraphQL请求不可缓存。

分层系统 - 是的

graph-based caching approach作为一个分层的架构...

...通过约束组件行为组成层级层,使得每个组件不能“看到”超出与它们交互的直接层。

您可以设置GraphQL服务器以将请求转发到其他GraphQL服务器,而无需客户端了解它。实际上,GraphQL服务器通常用作“前端的后端”,聚合来自客户端不知道的其他服务的数据。这是一个分层系统。

接口/统一合同 - 没有

这种约束通常通过四个子约束来制定:

  • 资源识别 - NO

如上所述,GraphQL不提供识别资源的统一机制。 described说:

HTTP通常与REST相关联,REST使用“资源”作为其核心概念。相比之下,GraphQL的概念模型是实体图。因此,GraphQL中的实体不会被URL标识。

  • 通过表示操纵资源 - 是(?)

假设GraphQL的资源是数据对象,传输的JSON(或其他格式)是表示(而不是将整个GraphQL端点视为单个资源)。然后,可以将变异的JSON表示发送回服务器以更新对象。

  • 自我描述性消息 - 否(?)

在我看来,这是一个意见问题。什么时候消息是自描述的?如果目标是通过客户端和服务器之间任意引入的中间层“可理解”,那么我认为GraphQL消息不是自我描述的。查询或突变的结构仅在服务器模式的上下文中有意义。可以从服务器请求此模式,但这会扩展单个消息的范围。

  • 超媒体作为应用程序状态的引擎(HATEOAS) - 否

这个很简单。 GraphQL根本不支持链接的概念,这是超媒体的前提和本质。 GraphQL documentation对这个主题有一些有趣的看法。

代码点播(可选) - 没有

键入从GraphQL服务器发送到客户端的所有数据。没有任何支持的类型可以执行。表示操作的变异请求仅从客户端发送到服务器,而不是从另一个方向发送。当然,总是可以将代码作为文本发送,但这可能不是GraphQL的设计目标。


总而言之,GraphQL不能满足所有REST要求。它可能不打算。它旨在解决REST原则引起的一些问题,主要是客户端需要多次HTTP往返来获取单个对象图,然后接收比实际使用的数据多得多的数据。

© www.soinside.com 2019 - 2024. All rights reserved.