Ruby中如何将REST动词参数嵌入Net::HTTP类调用?
Ruby动态创建Net::HTTP请求对象的正确写法
你之前的写法错误在于,Ruby无法直接通过字符串插值或变量名动态访问模块内的常量(也就是Net::HTTP下的Post、Get这些请求类)。以下是正确的实现方式:
核心方法:使用const_get动态获取常量
Net::HTTP模块下的Post、Get、Put等请求类都是模块内的常量,你可以通过const_get方法,根据字符串形式的常量名来获取对应的类,再创建实例:
# 假设restVerb的值是"Post"(注意首字母大写,和Net::HTTP内的类名一致) request = Net::HTTP.const_get(restVerb).new(uri)
处理大小写问题
如果你的restVerb参数是小写(比如"post"),需要先将其转换为符合Net::HTTP类名的格式(首字母大写):
# 转换为首字母大写格式 formatted_verb = restVerb.capitalize request = Net::HTTP.const_get(formatted_verb).new(uri)
可选:增加错误处理
如果担心传入的动词不存在对应的请求类,可以先判断常量是否存在,避免抛出NameError:
if Net::HTTP.const_defined?(restVerb) request = Net::HTTP.const_get(restVerb).new(uri) else # 处理无效动词的逻辑,比如抛出自定义错误或提示 raise "Unsupported HTTP verb: #{restVerb}" end
为什么之前的写法不行?
Net::HTTP::#{restVerb}.new(uri):这是语法错误,Ruby不允许在常量访问中直接使用字符串插值。Net::HTTP::restVerb.new(uri):这里Ruby会尝试寻找名为restVerb的常量,而不是变量restVerb的值对应的常量。Net::HTTP::$restVerb.new(uri):全局变量$restVerb的值无法直接作为常量名访问,同样不符合Ruby的常量访问规则。
内容的提问来源于stack exchange,提问作者Andrew Walker
相关产品推荐
相关产品推荐

