人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

●質問者: garyo
●カテゴリ:インターネット ウェブ制作
✍キーワード:.new 2006-08-25 405 CGI Client
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● いわどん
●60ポイント

手元で動作確認をしていませんので予想でしかありませんが、原因はサーバとクライアントの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の定義を上書きしてもよいですが、上書きするために必要なコードが多そうです。

◎質問者からの返答

ありがとうございます。

確かにローカルの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で呼び出せないのでしょうか?

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ