我正在开发一个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
答案 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&created_at=2012-07-10T13:58:13-04:00</string>
</value>
</param>
由于"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=...
但我不太了解Trac对请求参数的期望,或者宝石如何打算让Ruby的XMLRPC客户端在2年多前工作。
我会验证预期的请求格式(一个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>
元素),分叉Github repo,并做必要的更改为<param>
(对我来说似乎是问题的根源)。
如果params没有连接成单个字符串并且像<param>
那样保留为数组,那么methodCall`将在上面显示的第二个文档中生成有效的XML
args_to_trac_args