Ruby での XML-RPC の使い方を教えてください。

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です。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:
  • 終了:2006/11/29 16:18:53
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答1件)

id:iwadon No.1

回答回数60ベストアンサー獲得回数13

ポイント60pt

手元で動作確認をしていませんので予想でしかありませんが、原因はサーバとクライアントのRubyのバージョンの相違からなる不具合のように思います。この原因が正しいとすると対処方法は二つあります。

  1. サーバのRubyを1.8.5にする。
  2. クライアントのRubyを1.8.2にする、またはライブラリのxmlrpc/client.rbにあるContent-Typeの設定から";charset=utf-8"を外す。

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の定義を上書きしてもよいですが、上書きするために必要なコードが多そうです。

id:garyo

ありがとうございます。

確かにローカルのRubyのバージョンを1.8.2にすると動きました。

サーバーはレンタルサーバーなのでバージョンを変えるのは無理なので、ローカルを変えてみます。

C:\ruby\XMLRPC>c:\ruby\ruby-1.8.2\bin\ruby XMLRPCclient.rb
Sum: 8, Difference: 2

素朴な疑問ですが、サーバーでRuby1.8.2を使っている場合に呼び出し先のサーバーでRuby1.8.5を使っていた場合はCGIで呼び出せないのでしょうか?

2006/11/29 16:18:21
  • id:iwadon
    > 素朴な疑問ですが、サーバーでRuby1.8.2を使っている場合に呼び出し先のサーバーでRuby1.8.5を使っていた場合はCGIで呼び出せないのでしょうか?

    すみません、「サーバー」と「呼び出し先のサーバー」の違いがよくわかりません。HTTPサーバからさらに呼び出すサーバ(DB?)とかのことでしょうか? もしくはRuby 1.8.5がインストールされているマシンではHTTPサーバを起動できない、もしくはそのHTTPサーバを外部に公開できない、ということでしょうか?
  • id:garyo
    すみません。
    レンタルサーバーA と XMLRPCのAPIを公開しているアプリが動いているサーバーBがあるとして
    レンタルサーバーAがRuby1.8.2でサーバーBがRuby1.8.5の場合に
    レンタルサーバーAからXMLRPC/clientでサーバーBのXMLRPC/serverを呼び出すと同じく動かないような気がしたので。
  • id:iwadon
    これも推測なのですが、クライアントがRuby 1.8.2で、サーバがRuby 1.8.5であれば動くと思います。
    Ruby 1.8.5ではクライアントはContent-Typeを"text/xml; charset=utf-8"として送りますが、サーバはContent-Typeが"text/xml"でも"text/xml; charset=utf-8"でも受け付けられます。逆にRuby 1.8.2ではクライアントはContent-Typeを"text/xml"を送り、サーバは"text/xml"のみ受け付けます。このサーバの挙動が今回の質問にあるような問題を引き起こしました。ですので、問題があるのは1.8.2のサーバであり、他の組み合わせであればこの問題は起きないのではないかと思います。
    あとクライアントからcharsetを付けて送っていますが、サーバでは特にそのcharsetの設定値を使っているように見えませんでした(捨てている?)ので、クライアントからのリクエストのContent-Typeのcharsetの有無は特に気にしなくていいみたいです(多分)。

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません