http://q.hatena.ne.jp/1164694910の続きです。
http://garyo.boy.jp/ruby/XMLRPCserver.rb
上記にアクセスすると
405 Method Not Allowed
Unexpected error occured while processing XML-RPC request!
と表示されるのでCGIは動いているのですが、
>|ruby|
require 'xmlrpc/client'
client = XMLRPC::Client.new2('http://garyo.boy.jp/ruby/XMLRPCserver.rb')
#client = XMLRPC::Client.new2('http://localhost:8080/XMLRPCserver.rb')
result = client.call("sample.sumAndDifference", 5, 3)
sum = result["sum"]
difference = result["difference"]
puts "Sum: #{sum}, Difference: #{difference}"
||<
ローカルPCで上記を動かしても
>||
C:\ruby\XMLRPC>ruby XMLRPCclient.rb
C:/ruby/ruby-1.8/lib/ruby/1.8/xmlrpc/client.rb:546:in `do_rpc': HTTP-Error: 400
Bad Request (RuntimeError)
from C:/ruby/ruby-1.8/lib/ruby/1.8/xmlrpc/client.rb:420:in `call2'
from XMLRPCclient.rb:7
||<
となります。
ローカルPC上でWEBrickを動かした場合は問題なく動いています。
lolipopではXMLRPCが禁止されているとかそういう問題でしょうか?
ローカルPCのRubyのバージョンはruby 1.8.5 (2006-08-25) [i386-mswin32]
サーバーのRubyのバージョンは1.8.2です。
手元で動作確認をしていませんので予想でしかありませんが、原因はサーバとクライアントのRubyのバージョンの相違からなる不具合のように思います。この原因が正しいとすると対処方法は二つあります。
xmlrpc/server.rbでXMLRPC::CGIServerが400 Bad Requestを返す原因には二つあり、その一つがクライアントからのリクエストのContent-Typeがtext/xml以外の場合なのですが、1.8.2と1.8.5では判定方法が異なり、特に1.8.2では"text/xml"以外を受け付けません。
ところがRuby 1.8.5のxmlrpc/client.rbでは"text/xml; charset=utf-8"のようにcharsetが付加されているため、Ruby 1.8.2のXMLRPC::CGIServerが受け付けられないのではないか、と考えられます。もちろんRuby 1.8.5のXMLRPC::CGIServerではcharsetを含むConntent-Typeに対応しています。
対象方法は先に挙げたとおりで、できれば双方のRubyのバージョンをそろえた方がよいと思います。もしサーバのRubyをアップデートできないようでしたら、クライアント側のRubyで対処(Content-Typeにcharsetを含めないようにする)するとよいでしょう。またはサーバスクリプト内でXMLRPC::CGIServer#serveの定義を上書きしてもよいですが、上書きするために必要なコードが多そうです。
ありがとうございます。
確かにローカルのRubyのバージョンを1.8.2にすると動きました。
サーバーはレンタルサーバーなのでバージョンを変えるのは無理なので、ローカルを変えてみます。
素朴な疑問ですが、サーバーでRuby1.8.2を使っている場合に呼び出し先のサーバーでRuby1.8.5を使っていた場合はCGIで呼び出せないのでしょうか?