RailgoをRubyで使う(パート2)
あー・・・疲れた。
RubyでRailgoのつづきです。
先ほどのエントリで、駅名を検索して取ってくるとこまでできたんですが、
その後、経路検索でどうしてもうまく行かない。
以下のようなプログラムで
SearchCourseメソッドを呼んで経路検索をしようとしたところ、
どうしても変なエラーが出る。
数時間悩んで(つかれて半分寝てましたが・・)
SOAP4rのバージョンあげて1.5.7というやつを入れてみたところ、
動くようになりますたヨ・・;;
Railgo.rb
require 'soap/wsdlDriver'
require './RailgoAuthHandler'module Mashup
WSDL_URL = 'http://wstest.railgo.jp/ExpService06.asmx?wsdl'
class Railgo
@@wsdlFactory = SOAP::WSDLDriverFactory.new(WSDL_URL)
@@driver = @@wsdlFactory.create_rpc_driver
@@driver.generate_explicit_type = true
#For auth
handler = Mashup::RailgoAuthHandler.new
@@driver.headerhandler.add(handler)
#----------------------------------------
# 駅名文字列に対応するStationオブジェクトを返します
#----------------------------------------
def Railgo.getStation(name)
begin
#response =driver.GetDefaultNavigation({})
request = {'StationYomi'=> name,
'AreaType' => "Japan",
'StationType' =>"RailRoad",
'Date'=>'20070913'}
response = @@driver.SearchStation(request)
rescue SOAP::FaultError => err
print err
raise
end
ret = response['SearchStationResult']['Station']
ret = (ret.is_a?(Array))?ret[0]:ret
#ret['Latitude']['bearing']
end#----------------------------------------------
# 駅名文字列配列に対応するStationオブジェクト配列を返します
#----------------------------------------------
def Railgo.getStations(aryNames)
ret = []
aryNames.each {|station|
ret<< Railgo.getStation(station)
}
ret
end
#-------------------------------------------
# 経路検索
# Station配列を与えると対応するCourse配列を返します。
#-------------------------------------------
def Railgo.getCourses(stations)
begin
resNavi = @@driver.GetDefaultNavigation({})
navi = resNavi['GetDefaultNavigationResult']
request = {'Stations' => stations, 'SearchOption' => navi }
response = @@driver.SearchCourse(request)
rescue SOAP::FaultError => err
print err
raise
end
ret = response['SearchCourseResult']['Course']
#ret = navi
#ret = response
(ret.is_a?(Array))?ret[0]:ret
end
end
end
SearchCourse.cgi
#!/usr/local/bin/ruby -Ku
require 'cgi'
require 'soap/wsdlDriver'
require 'Railgo'cgi = CGI.new
print cgi.header({"charset" => "utf-8"})sName = cgi["name"]
stationsStr = ["武蔵小金井", "新宿", "東戸塚"]
stations = Mashup::Railgo.getStations(stationsStr)
response = Mashup::Railgo.getCourses(stations)# test output
puts "Response:" + response.inspect
エラーでてるまわりのソースみてたらさー、
#ToDo: Test とかあやしいことかいてあるからさー・・
ちっとはあやしいとはおもったんだけどさー・・
まさかバージョンあげたらなおっちゃうとは思いませんでしたよ・・
古いバージョンのlib/soap/mapping/wsdlliteralregistry.rb, line 119
119: def complexobj2soap(obj, type, qualified)
120: o = SOAPElement.new(type.name)
121: o.qualified = qualified
122: type.each_element do |child_ele|
123: child = Mapping.get_attribute(obj, child_ele.name.name)
124: if child.nil?
125: if child_ele.nillable
126: # ToDo: test
127: # add empty element
128: child_soap = obj2elesoap(nil, child_ele)
129: o.add(child_soap)
130: elsif Integer(child_ele.minoccurs) == 0
131: # nothing to do
132: else
133: raise MappingError.new("nil not allowed: #{child_ele.name.name}")
134: end
135: elsif child_ele.map_as_array?
136: child.each do |item|
137: child_soap = obj2elesoap(item, child_ele)
138: o.add(child_soap)
139: end
140: else
141: child_soap = obj2elesoap(child, child_ele)
142: o.add(child_soap)
143: end
144: end
145: o
146: end
いやー・・ Ruby 熱いぜ^^
(まだ業務じゃ使えないっていうのは、こういうところなんだろうねぇ・・残念;)
でも、おかげさまで、TCPモニターなるものを使って調査したり、
回り道でいろいろスキルがつきましたです。
最近のコメント