GraphQL是API的查询语言。通常,在我们的API中创建REST端点时,通常的趋势是为需求创建端点。假设您的端点返回了一个员工列表,每个员工都有一般属性,例如姓名,年龄和地址(假设地址是映射到员工的另一个模型,每个员工都有一个地址)。现在,在某个时间点,您只需要数据用于其地址,即数据库中所有地址的列表(仅限国家,城市和街道)。为此,您需要在服务中使用全新的端点。
这就是GraphQL的强大功能,它允许您只处理单个端点,并根据请求的主体更改其输出。每个请求都将调用相同的端点,但使用不同的RequestBody。它只会收到它所需的结果。
请参阅代码在GitHub上的完整代码文件。这是一个带有H2数据库的maven项目,它在类路径中有data.sql用于数据库查询。此代码围绕从数据库中获取所有员工的列表。
现在,让我们从Spring Boot的实际实现开始。
我们有两个模型类:员工和地址以及相应的getter和setter。
@实体
@表公共 类 员工 { 字符串 名称 ;@ID字符串 ID ;INT 年龄 ;@OneToOne(级联 = CascadeType的。ALL)@JoinColumn(name = “addid”)地址 地址 ; //......getters and setters .... //}@实体
@表公共 类 地址 { @ID@GeneratedValueString addid ;字符串 国家 ;弦 城 ;弦 平 ; //......getters and setters .... //}为了实现存储库,我们将EmployeeRepo作为:@Repository
公共 接口 EmployeeRepo 扩展了 CrudRepository < Employee,String > {public List < Employee > findAll();
}
现在,GraphQL在类路径中需要一个.graphqls文件,它解析并理解它需要处理的请求类型。您将在代码中找到employee.graphqls。让我解释一下。它包含:
类型 员工 {
....... 员工 详细信息
}
并 输入 地址 {
........ 地址 详情
}
在这里,我们定义了类的模式,它们将以某种方式作为对端点的响应返回,即它将返回所有员工,所有员工的地址,仅所有员工的姓名等。 。我们还定义了:
类型 Query {
allEmployee:[ 员工 ]
}查询类型(将由客户端发送或将出现在RequestBody中的查询)返回员工列表。因此,RequestBody到我们的端点将包含一个root查询作为allEmployee。
我们在这里讨论请求:
1.要求所有员工没有地址的请求:
{
allEmployee { 名称年龄
ID
}}2.仅要求员工姓名及其所属国家/地区的请求:{
allEmployee { 名称地址 { 国家}}}
3.仅要求所有员工的地址的请求将是:{
allEmployee {地址 {
国家市 平面 ADDID
}
}}