如何让GraphQL Ruby的接口参数支持多种类型?
在graphql-ruby中实现多类型参数
你的需求完全可行,下面提供两种常用的实现方式:
方法一:使用联合类型(Union Type)
在graphql-ruby中,你可以为参数定义联合类型,同时支持Integer和String输入:
# 先定义联合类型 class UserIdUnion < GraphQL::Schema::Union description "Either an integer ID or a string-encoded ID token" possible_types GraphQL::Types::Int, GraphQL::Types::String end # 然后在字段中使用这个联合类型作为参数类型 field :search_user, UserType, 'Performs a user search' do argument :user_id, UserIdUnion, required: true end def search_user(user_id) id = if user_id.is_a?(String) decode_id(user_id) else user_id end User.find(id) end
注意:联合类型作为参数时,GraphQL会自动验证输入是否属于允许的类型之一,不符合的请求会直接返回错误。
方法二:自定义标量类型(Custom Scalar)
如果需要更灵活的输入处理,可以自定义一个标量类型,负责解析Integer或String输入:
class UserIdScalar < GraphQL::Schema::Scalar description "Accepts either an integer ID or a string-encoded ID token" def self.coerce_input(input_value, context) # 直接返回输入值,后续在 resolver 中处理类型判断 input_value end def self.coerce_result(ruby_value, context) # 如果需要返回该类型的结果,这里可以定义格式化逻辑 ruby_value.to_s end end # 在字段中使用自定义标量 field :search_user, UserType, 'Performs a user search' do argument :user_id, UserIdScalar, required: true end def search_user(user_id) id = user_id.is_a?(String) ? decode_id(user_id) : user_id User.find(id) end
这种方式的优势是可以在标量内部提前处理类型转换(比如自动解码字符串ID),让resolver逻辑更简洁。
内容的提问来源于stack exchange,提问作者Pants
相关产品推荐
相关产品推荐

