XMLRPC :: DateTime格式

时间:2012-07-10 17:25:20

标签: ruby-on-rails datetime parameters xml-rpc trac

我正在开发一个Rails项目,该项目需要使用XMLRPC协议来访问Trac数据库。

在我需要使用XMLRPC::DateTime参数发出请求之前,一切都运行良好。现在当我去加载页面时,我收到错误消息:

Wrong content-type (received 'application/xml' but expected 'text/xml')

我尝试以多种不同方式(下面列出)格式化日期参数,但似乎没有任何工作。

我试过了:

    - @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)

你知道这里可能出现什么问题吗?

更新:我调用的代码粘贴在下面(我正在使用trac4r ruby​​ gem来实际调用API):

def foo  
   date = DateTime.now.to_s  
   tickets = trac.tickets.query(:max => 1000, :created_at => date)  
   return tickets.size  
end

1 个答案:

答案 0 :(得分:1)

您使用的宝石在超过2年内尚未更新。我之所以提到这一点是因为随着年龄的增长,宝石的某些功能可能会因为之后Ruby的XMLRPC中可能发生的变化而无法工作(我将不得不挖掘更多以找到证据)

我不喜欢这种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的{​​{1}}方法中,上述字符串会传递到call中的methodCall。如果查看该方法的源代码,您将看到它尝试为传递的每个参数生成有效的XML元素。

XMLRPC::Create

这会生成一个{/ 1}}元素,如

parameter = params.collect do |param|
    @writer.ele("param", conv2value(param))
end

如果我使用<param>字符串手动生成完整文档,因为gem将

<param>
  <value>
    <string>max=1000&amp;created_at=2012-07-10T13:58:13-04:00</string>
  </value>
</param>

由于"max=1000&created_at=2012-07-10T13:58:13-04:00"

,生成的XML 无效
require "xmlrpc/client"

writer = XMLRPC::Create.new
writer.methodCall('ticket.query', "max=1000&created_at=2012-07-10T13:58:13-04:00")

对我而言,似乎预期的反应更像是

&created_at=...

但我不太了解Trac对请求参数的期望,或者宝石如何打算让R​​uby的XMLRPC客户端在2年多前工作。

我会验证预期的请求格式(一个XML <?xml version="1.0" ?> <methodCall> <methodName>ticket.query</methodName> <params> <param> <value> <string>max=1000&amp;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> 元素),分叉Github repo,并做必要的更改为<param> (对我来说似乎是问题的根源)

如果params没有连接成单个字符串并且像<param>那样保留为数组,那么methodCall`将在上面显示的第二个文档中生成有效的XML

args_to_trac_args