您使用的 gem 已超过 2 年未更新。我之所以提到这一点,是因为随着年龄的增长,由于 Ruby 的 XMLRPC 中可能发生的变化,gem 的某些功能可能不再起作用(我将不得不进行更多挖掘以找到证据)。
我不喜欢的是这种args_to_trac_args
方法。
> args_to_trac_args({:max => 1000, :created_at => DateTime.now.to_s})
=> "max=1000&created_at=2012-07-10T13:58:13-04:00"
然后将该字符串传递给XMLRPC::Client
实例的call
方法。
在XMLRPC::Client
'call
方法中,将上述字符串传递给methodCall
in XMLRPC::Create
。如果您查看该方法的源代码,您会看到它尝试为每个传递的参数生成有效的 XML 元素。
parameter = params.collect do |param|
@writer.ele("param", conv2value(param))
end
这正在生成一个<param>
像
<param>
<value>
<string>max=1000&created_at=2012-07-10T13:58:13-04:00</string>
</value>
</param>
"max=1000&created_at=2012-07-10T13:58:13-04:00"
如果我使用字符串作为 gem手动生成完整的文档
require "xmlrpc/client"
writer = XMLRPC::Create.new
writer.methodCall('ticket.query', "max=1000&created_at=2012-07-10T13:58:13-04:00")
生成的 XML无效,因为&created_at=...
<?xml version="1.0" ?>
<methodCall>
<methodName>ticket.query</methodName>
<params>
<param>
<value>
<string>max=1000&created_at=2012-07-10T13:58:13-04:00</string>
</value>
</param>
</params>
</methodCall>
对我来说,预期的反应似乎更像
<?xml version="1.0" ?>
<methodCall>
<methodName>ticket.query</methodName>
<params>
<param>
<value>
<string>max=1000</string>
</value>
</param>
<param>
<value>
<string>created_at=2012-07-10T13:58:13-04:00</string>
</value>
</param>
</params>
</methodCall>
但我不太了解 Trac 期望作为请求参数的内容,或者 gem 打算如何让 Ruby 的 XMLRPC 客户端在 2 年前工作。
我将验证预期的请求格式(一个包含参数查询字符串或多个元素的XML<param>
<param>
) ,派生 Github 存储库,并对args_to_trac_args
(对我来说这似乎是问题的根源)进行必要的更改。
如果参数没有连接到单个字符串中并作为数组保留,例如["max=1000", "created_at=2012-08-10T13:58:13-04:00"],
methodCall` 将在上面显示的第二个文档中生成有效的 XML
writer = XMLRPC::Create.new
writer.methodCall('ticket.query', "max=1000", "created_at=2012-07-10T13:58:13-04:00")