TL;DR我的突变定义中的一个特定参数现在配置为 String, required: true,这使其成为非空的强制字符串参数。正在将其更改为 String, required: :nullable
TL;DR 我的突变定义中的一个特定参数现在配置为 String, required: true
使其成为非空的强制字符串参数。将其更改为被 String, required: :nullable
视为重大更改,并且可能会破坏 API 的客户端?
我有一个使用 graphql 的 Ruby on rails 后端。这是定义的突变之一(仅仅是一个例子):
class Mutations::UpdatePerson < Mutations::BaseMutation
argument :id, Integer, "The person's unique identifier.", required: true
argument :name, String, "The new name of the person.", required: true
type Types::PersonType
end
此 API 的客户端可能对此变异有一个调用定义,如下所示:
mutation change_someone($new_name: String!){
update_person(id:118607869, name: $new_name) {
id
name
}
}
我想使该 name
参数非强制性。我仍然希望突变调用要求通过其名称 ( name
) 指定变量,但也希望明确接受空值。因此允许这样做: update_person(id:118607869, name: null)
,但不允许这样做: update_person(id:118607869)
.
阅读完此处的 文档 ,我通过如下方式更改突变定义设法实现了此行为:
class Mutations::UpdatePerson < Mutations::BaseMutation
argument :id, Integer, "The person's unique identifier.", required: true
argument :name, String, "The new name of the person.", required: :nullable
type Types::PersonType
end
这是按预期工作的,但我的问题是 - 对于已经定义了具有参数和签名的请求的 API 使用者(如上所述),这是否有可能实际上破坏客户端代码?
根据 graphql 规范:
随着 GraphQL 类型系统架构不断演变,添加新类型和新字段,之前有效的请求可能会在之后变得无效。任何可能导致之前有效的请求变得无效的更改都被视为重大更改。
我尝试使用 graphql API 游乐场进行各种声明变体,但无法使其中断(即因 \'编译\' 错误而变为红色)。在我看来,扩大可能的输入值列表不应被视为重大更改,但我只是想 100% 确定。(将满足于 99.999%)