发布于 2018-03-04 03:53:15
让我们检查一下字段约束,并检查GraphQL是否实现了这些约束:
客户端-服务器架构-是的
GraphQL主要是一种查询语言,它指定从客户端到服务器的查询。
无国籍状态-是的
详细讨论了这一点,这里。简单地说,是的,GraphQL是无状态的,因为没有会话概念,而且服务器不需要任何其他信息来处理请求。
可缓存性- NO
这个更难对付。从技术上讲,您可以在HTTP级别缓存GraphQL查询(如果是使用HTTP)。但是,由于客户端可以查询对象和属性的任意组合,这种缓存的命中率可能很低,而且缓存的信息高度冗余。因此,GraphQL开发人员建议使用基于图形的缓存方法。然而,这种方法需要全局唯一标识符,在GraphQL规范的基础上引入额外的约束,这与REST的“资源标识”约束很相似(参见下文)。
另一种选择是将缓存推迟到向GraphQL服务器提供数据的其他组件,但这与GraphQL本身无关。鉴于以上所述,我认为默认情况下GraphQL请求是不可缓存的。
分层系统-是的
将所述作为一个分层的体系结构.
..。通过约束组件行为,使每个组件不能“看到”与其交互的直接层之外的层次结构层。
您可以设置一个GraphQL服务器,将请求转发到其他GraphQL服务器,而客户端不知道它。在实践中,GraphQL服务器通常被用作“前端的后端”,从客户不知道的其他服务中聚合数据。这是一个分层系统。
接口/统一合同-否
这个约束通常是通过四个子约束来表述的:
如上所述,GraphQL没有提供统一的机制来识别资源。GraphQL文档指出:
HTTP通常与REST相关联,REST使用“资源”作为其核心概念。相反,GraphQL的概念模型是一个实体图。因此,GraphQL中的实体不被URL识别。
让我们假设GraphQL的资源是数据对象,而传输的JSON (或其他格式)是表示(而不是将整个GraphQL端点看作一个单一资源)。然后,可以向服务器发送一个变异的JSON表示来更新对象。
在我看来,这是一个意见问题。什么时候消息是自我描述的?如果目标是通过客户机和服务器之间任意引入的中间层来“理解”,那么我认为GraphQL消息不是自我描述的。查询或突变的结构只有在服务器架构的上下文中才有意义。可以从服务器请求此架构,但这将扩展单个消息的范围。
这个很简单。GraphQL根本不支持链接的概念,链接是超媒体的前提和本质。这篇文章对这个主题有一些有趣的看法。
按需代码(可选)- NO
从GraphQL服务器发送到客户端的所有数据都是输入的。不打算执行任何受支持的类型。表示操作的变异请求只从客户端发送到服务器,而不是从另一个方向发送。当然,将代码作为文本发送是可能的,但这并不是GraphQL设计的目的。
总之,GraphQL并不能满足其他所有的需求。而且可能不是故意的。它旨在解决REST原则带来的一些问题,主要是客户端需要多个HTTP往返来获取单个对象图,然后接收比实际使用的更多的数据。
https://stackoverflow.com/questions/44951074
复制相似问题