GraphQL和Fieldings REST约束

GraphQL和Fieldings REST约束,rest,client-server,graphql,distributed-system,Rest,Client Server,Graphql,Distributed System,在his中,定义了一组应满足RESTAPI的规则 其中包括以下规则: 客户端服务器 无状态缓存接口 统一合同(超媒体或HATEOAS等) 分层系统 使用GraphQL是否可以满足这些要求 虽然points客户端-服务器、无状态和分层系统可能已经实现,但我不确定points缓存和统一契约是否已经实现。让我们看看Fieldings约束,并检查GraphQL是否满足这些约束: 客户端-服务器体系结构-是 GraphQL(主要)是一种查询语言,指定从客户端到服务器的查询 无国籍状态-是 对此进行了详

在his中,定义了一组应满足RESTAPI的规则

其中包括以下规则:

  • 客户端服务器
  • 无状态缓存接口
  • 统一合同(超媒体或HATEOAS等)
  • 分层系统
使用GraphQL是否可以满足这些要求


虽然points客户端-服务器、无状态和分层系统可能已经实现,但我不确定points缓存和统一契约是否已经实现。

让我们看看Fieldings约束,并检查GraphQL是否满足这些约束:

客户端-服务器体系结构-是

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

无国籍状态-是

对此进行了详细讨论。 简短的回答是肯定的,GraphQL是无状态的,因为没有会话概念,服务器不需要任何附加信息来处理请求

可缓存性-否

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

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

分层系统-是

将分层体系结构部署为一体

。。。通过约束组件行为由层次结构层组成 这样,每个组件都无法“看到”具有 它们正在相互作用

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

接口/统一合同-否

该约束通常通过四个子约束来表述:

  • 资源识别-否
如上所述,GraphQL没有提供统一的机制来标识资源。各国:

HTTP通常与REST相关联,REST使用“资源”作为其基础 核心概念。相反,GraphQL的概念模型是一个实体 图表因此,GraphQL中的实体不由URL标识

  • 通过表示操作资源-是(?)
让我们假设GraphQL的资源是数据对象,传输的JSON(或其他格式)是表示(而不是将整个GraphQL端点视为单个资源)。然后,向服务器发送一个经过变异的JSON表示以更新对象是可能的

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

  • 作为应用程序状态引擎的超媒体(HATEOS)-否
这个很简单。GraphQL根本不支持链接的概念,链接是超媒体的前提和本质。对这个话题有一些有趣的看法

按需编码(可选)-否

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



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

让我们看看Fieldings约束,并检查GraphQL是否满足这些约束:

客户端-服务器体系结构-是

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

无国籍状态-是

对此进行了详细讨论。 简短的回答是肯定的,GraphQL是无状态的,因为没有会话概念,服务器不需要任何附加信息来处理请求

可缓存性-否

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

另一个选项是将缓存延迟到向GraphQL服务器b提供数据的其他组件