在软件开发中,API(应用程序接口)是连接不同软件应用的桥梁,它定义了应用程序间请求和交换信息的方法和数据格式。传统的RESTful API通过定义不同的HTTP方法(如GET、POST等)来实现数据的获取和提交。然而,当客户端有特定的数据需求时,如需要的数据量过大或过小,传统的API设计就会遇到挑战。为了解决这些问题,Facebook在2012年开发了GraphQL,并于2015年开源。GraphQL提供了一种更高效、灵活的方式来替代传统的REST API,允许客户端精确地请求它们所需的数据,不多也不少。
GraphQL不仅仅是一种查询语言,它还定义了一种运行时环境,用于执行这些查询并返回现有数据。客户端可以指定它们需要的响应结构,服务器则返回确切的数据。这种方式有助于减少过度获取(over-fetching)或不足获取(under-fetching)的问题。GraphQL还允许在一次请求中检索多个资源,从而避免了多次往返服务器的需要。
GraphQL不依赖于任何特定的数据库或存储系统,并且可以使用各种编程语言。它因其能够简化数据获取并为API开发提供更定制化的方法而受到欢迎。
接下来,将探讨GraphQL的工作原理以及如何在C#中使用HotChocolate库来实现GraphQL服务。
API是一组规则和工具,允许不同的软件应用程序相互通信。API定义了应用程序可以用来请求和交换信息的方法和数据格式。例如,作为开发者,如果希望允许客户端获取有关账户或客户信息,可能会提供一个使用GET方法的端点来执行这些操作。
这种设计在行业中被广泛认可,并且还能够为所有应用程序建立统一和标准化的接口。
如果一个客户端有特定的需求,会发生什么?
假设有一个移动应用程序,它能够获取有关客户的数据。然而,让考虑这样一种情况:这个应用程序的用户开始抱怨页面加载延迟。经过调查,发现这是因为GET /customers端点返回了过多的不必要数据。
现在有两个用于获取客户数据的端点。但是,现在考虑Java客户端有相反的需求:返回的数据不足,它希望在有效载荷中获取更多信息。
在这个阶段,为所有应用程序提供统一接口的优势减少了,因为正在接近每个客户端几乎需要一个专用后端的场景。此外,如果还需要对其他几个请求进行类似的调整,维护复杂性将变得难以承受。此外,获取所有信息可能需要执行多个请求。
为了解决这个挑战,GraphQL在2012年被引入。GraphQL是一种API的查询语言,也是一种运行时环境,用于执行这些查询并返回现有数据。GraphQL允许客户端精确地请求它们所需的数据,不多也不少。
客户端可以指定它们需要的响应结构,服务器则返回确切的数据。这种方式有助于减少过度获取或不足获取的问题。GraphQL还允许在一次请求中检索多个资源,从而避免了多次往返服务器的需要。
GraphQL不依赖于任何特定的数据库或存储系统,并且可以使用各种编程语言。它因其能够简化数据获取并为API开发提供更定制化的方法而受到欢迎。
GraphQL是一种规范,其目标之一是允许客户端精确地接收它们请求的数据。为了实现这一点,客户端和服务器必须就将要交换的数据进行协商,GraphQL的目的是促进并满足这种协商。
这种协商在传统API中是无法实现的;它需要在服务器端安装运行时。这个有形的运行时是GraphQL规范的实现。
HotChocolate是GraphQL规范在C#中的一个实现示例。
GraphQL服务是通过定义类型和这些类型上的字段,然后为每个类型上的每个字段提供函数来创建的。
因此,可以交换的数据在服务器端定义(具体实现将再次取决于所选的运行时)。例如,对于客户,可以这样定义它。
{
type customer {
id: string
name: string
age: float
}
}
在这里,直接声明了一个名为"customer"的实体类型,它有三个属性。
重要的是要注意,上面用来表示实体的符号是个人选择,不是GraphQL规范所规定的。
本质上,GraphQL只涉及为数据定义一个类型系统,并实现一个服务器运行时来根据这个类型系统处理查询。
在实践中,定义的类型系统可以更复杂,包括嵌套对象,因此得名GraphQL。
{
type customer {
id: string
name: string
age: integer
commands: [command]
}
type command {
reference: string
amount: float
}
}
GraphQL允许定义一个服务器理解的类型系统,使其只返回请求的数据。在这方面,GraphQL可以被概念化为一个查询语义引擎,赋予查询智能,超越了通过GET或POST请求简单地检索完整JSON数据。
这是在服务器端定义的所有基础设施的好处所在:在GraphQL服务器上查询数据时,可以精确地选择所需的信息,不多也不少。此外,由于智能现在嵌入在查询及其有效载荷中,不再需要多个端点,就像在更传统的RESTAPI中看到的那样,只有一个端点将有用(这个单一端点被普遍指定为/graphql)。唯一的要求是一个GraphQL客户端,特别是一个能够向GraphQL服务器发出请求的库。所有编程语言都有自己的GraphQL客户端可用,对于这个系列,将使用JavaScript。
GraphQL请求可以使用GET或POST方法执行,但在这个系列中,将专门使用POST请求。
这篇文章只提供了GraphQL背后的哲学概述。省略了许多与这个规范相关的复杂性,包括高级功能,如订阅或变更。这些概念将在更高级的教程中讨论。