GraphQL 中的动态查询
一个简单的 GraphQL 查询如下所示:
query myQuery() {
user {
age
firstName
lastName
dob
}
}
上述查询返回格式如下
data {
user {
age: 23,
firstName: "John",
lastName: "Smith",
dob: "01-01-1970"
}
}
嗯,这很标准。GraphQL 端点会返回请求的确切字段。
现在,如果我想每次都查询不同的字段怎么办?例如,我想先查询{ age, firstName }
第一次,然后再查询第二次{ age, dob }
。我不想firstName
在第二次查询时获取数据,因为我不需要它。这是一种可靠的方法,尤其是在 API 调用涉及某些字段时。
用例如下
- UI 上有一个清单,其中包含需要获取的数据元素。
- 用户选择他的授权标准,我们只想获取该标准。
一种方法是根据指定的字段生成查询。但是,一旦引入嵌套的 JSON,就会变得非常混乱。
为了解决这个问题,GraphQL 有一个非常方便的功能,称为指令。具体来说,@include
指令解决了动态查询的问题。
@include
现在,我们将使用指令重写上述查询。
query myQuery($age: Boolean!, $firstName: Boolean!, $lastName: Boolean!, $dob: Boolean!) {
user {
age @include(if: $age)
firstName @include(if: $firstName)
lastName @include(if: $lastName)
dob @include(if: $dob)
}
}
variables:
{
age: true,
firstName: true,
lastName: false,
dob: false
}
上述查询的响应将是:
data {
user {
age: 23,
firstName: "John"
}
}
age
由于仅返回在 JSON 变量中firstName
被设置为 的那些值,因此它仅返回 和 。此指令的另一个优点是,GraphQL 引擎甚至不会执行相应的解析器,从而提升了性能。操作这些 JSON 变量非常简单,查询无需针对每个请求进行修改。要获取而不是 的值,我们只需更改JSON 变量中的和 即可。true
@include
dob
firstName
firstName: false
dob: true
使用此指令的缺点是查询会变得更加冗长,并且需要在多个位置重复变量。但正如这里所解释的,它是 GraphQL 类型安全的固有组成部分。
鏂囩珷鏉ユ簮锛�https://dev.to/freakomonk/dynamic-queries-in-graphql-1pbb