我正在开发一个Rails项目,该项目需要使用XMLRPC协议来访问Trac数据库。
在我需要使用XMLRPC::DateTime参数发出请求之前,一切都运行得很好。现在,当我加载页面时,我得到了错误消息:
Wrong content-type (received 'application/xml' but expected 'text/xml')我尝试过用一系列不同的方法设置date参数的格式(如下所示),但似乎都不起作用。
我试过了:
- @date = Time.now #=> (Tue Jul 10 10:18:01 -0700 2012)
- @date = DateTime.now #=> (2012-07-10T10:17:37-07:00)
- @date = Time.now.to_datetime #=> (2012-07-10T10:19:24-07:00)
- @date = XMLRPC::Convert.dateTime(Time.now.to_datetime.to_s) #=>
#<XMLRPC::DateTime:0x1276aa068>
(The above hex number changes each time the page is refreshed)你知道这里会出什么问题吗?
更新:我进行调用的代码粘贴在下面(我使用API ruby gem来实际调用trac4r ):
def foo
date = DateTime.now.to_s
tickets = trac.tickets.query(:max => 1000, :created_at => date)
return tickets.size
end发布于 2012-07-11 02:53:02
您正在使用的gem已经两年多没有更新过了。我之所以提到这一点,是因为随着年龄的增长,由于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中的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>如果我像gem那样使用"max=1000&created_at=2012-07-10T13:58:13-04:00"字符串手动生成完整的文档
require "xmlrpc/client"
writer = XMLRPC::Create.new
writer.methodCall('ticket.query', "max=1000&created_at=2012-07-10T13:58:13-04:00")由于&created_at=...的原因,生成的XML是无效的
<?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客户端在2+上工作。
我将验证预期的请求格式(一个包含参数查询字符串或多个<param>元素的XML ),派生Github代码库,并对args_to_trac_args进行必要的更改(对我来说,这似乎是问题的根源)。
如果参数没有连接到单个字符串中,并保留为类似于["max=1000", "created_at=2012-08-10T13:58:13-04:00"],的数组,则methodCall`Call`将在上面显示的第二个文档中生成有效的XML
writer = XMLRPC::Create.new
writer.methodCall('ticket.query', "max=1000", "created_at=2012-07-10T13:58:13-04:00")https://stackoverflow.com/questions/11418638
复制相似问题