1

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

在我需要使用参数发出请求之前,一切都运行良好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
4

1 回答 1

1

您使用的 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方法中,将上述字符串传递给methodCallin XMLRPC::Create。如果您查看该方法的源代码,您会看到它尝试为每个传递的参数生成有效的 XML 元素。

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

这正在生成一个<param>

<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"如果我使用字符串作为 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&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>

但我不太了解 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")
于 2012-07-10T18:53:01.977 回答