GraphQL查询类型不匹配,如何替换输入类型名或自定义标量兼容
问题对应解决方案
一、替换请求中输入类型名的实现方式
- 若可控制发送请求的客户端代码,直接修改查询的变量定义段即可:将
$registrationNumbers: [RegistrationNumberAttributes!]!修改为$registrationNumbers: [RegistrationNumberInput!]!,将$birthDate: ISO8601Date修改为$birthDate: DateTime!,该方案改造成本最低。 - 若无法修改客户端请求内容,可在服务端新增一层请求代理中间件:在GraphQL请求到达解析器前,通过正则精准匹配查询字符串中的类型定义部分,将
RegistrationNumberAttributes!替换为RegistrationNumberInput!、ISO8601Date替换为DateTime!,处理完成后再转发给实际GraphQL服务处理即可,注意替换逻辑要避开字段名、返回值类型等位置避免误改。
二、其他可行解决方案
- 若你使用的GraphQL框架支持类型别名,可直接在服务端Schema中为现有类型定义别名:
type RegistrationNumberAttributes = RegistrationNumberInput、scalar ISO8601Date = DateTime,无需修改任何请求代码,服务端即可自动兼容两种类型名。 - 也可直接在服务端Schema中补全缺失的类型:新增
RegistrationNumberAttributes输入类型,内部字段结构和RegistrationNumberInput完全一致;新增ISO8601Date标量,序列化、反序列化逻辑完全复用现有DateTime标量的逻辑即可。
三、自定义ISO8601Date标量的可行性
该方案完全可行,属于兼容性最高的方案之一。你只需要在服务端Schema中新增scalar ISO8601Date的定义,然后将该标量的解析、序列化逻辑完全复用现有DateTime标量的逻辑即可,不需要额外开发业务代码,就能直接兼容客户端传入的ISO8601Date类型请求。如果后续有其他客户端传入不同的日期标量名,也可以用同样的方式新增标量复用逻辑,不会影响现有业务流程。
内容的提问来源于stack exchange,提问作者Bruno Bernard
相关产品推荐
相关产品推荐

