首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XMLRPC::DateTime格式

XMLRPC::DateTime格式
EN

Stack Overflow用户
提问于 2012-07-11 01:25:20
回答 1查看 1.2K关注 0票数 1

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

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

代码语言:javascript
复制
Wrong content-type (received 'application/xml' but expected 'text/xml')

我尝试过用一系列不同的方法设置date参数的格式(如下所示),但似乎都不起作用。

我试过了:

代码语言:javascript
复制
    - @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 ):

代码语言:javascript
复制
def foo  
   date = DateTime.now.to_s  
   tickets = trac.tickets.query(:max => 1000, :created_at => date)  
   return tickets.size  
end
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-07-11 02:53:02

您正在使用的gem已经两年多没有更新过了。我之所以提到这一点,是因为随着年龄的增长,由于Ruby的XMLRPC中可能发生了变化,gem的一些特性可能不再起作用(我将不得不挖掘更多的证据来证明这一点)。

我不喜欢的是这个args_to_trac_args方法。

代码语言:javascript
复制
> 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::Clientcall方法中,上面的字符串被传递给methodCall中的XMLRPC::Create,如果查看该方法的源代码,就会看到它试图为传递的每个参数生成有效的XML元素。

代码语言:javascript
复制
parameter = params.collect do |param|
    @writer.ele("param", conv2value(param))
end

这将生成一个<param>元素,如下所示

代码语言:javascript
复制
<param>
  <value>
    <string>max=1000&amp;created_at=2012-07-10T13:58:13-04:00</string>
  </value>
</param>

如果我像gem那样使用"max=1000&created_at=2012-07-10T13:58:13-04:00"字符串手动生成完整的文档

代码语言:javascript
复制
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是无效的

代码语言:javascript
复制
<?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>

在我看来,预期的反应更像是这样的

代码语言:javascript
复制
<?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

代码语言:javascript
复制
writer = XMLRPC::Create.new
writer.methodCall('ticket.query', "max=1000", "created_at=2012-07-10T13:58:13-04:00")
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11418638

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档