1

TracデータベースにアクセスするためにXMLRPCプロトコルを使用する必要がある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)

ここで何がうまくいかないか知っていますか?

更新:呼び出しを行うコードは以下に貼り付けられています(実際にAPIを呼び出すためにtrac4r ruby​​ gemを使用しています):

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の文字列がin にcall渡されます。そのメソッドのソースを表示すると、渡された各パラメーターに対して有効な XML 要素を生成しようとしていることがわかります。methodCallXMLRPC::Create

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"宝石のように文字列を使用して手動で完全なドキュメントを生成すると

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 が要求パラメーターとして何を期待しているのか、または Ruby の XMLRPC クライアントが 2 年以上前に動作するように gem がどのように意図していたのかについて、私は十分に知りません。

予想されるリクエスト形式(引数のクエリ文字列または複数の要素を含む1 つの XML<param><param> ) を確認し、Github リポジトリをフォークし、必要な変更を加えますargs_to_trac_args (私にはそれが問題の原因であると思われます)

パラメータが単一の文字列に結合されず、["max=1000", "created_at=2012-08-10T13:58:13-04:00"],methodCall` のような配列として残されている場合、上記の 2 番目のドキュメントで有効な 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 に答える