« Ruby でproxyサーバ経由のSOAP/HTTP | トップページ | TCPモニタでSOAP通信をチェック »

2007年9月18日 (火)

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モニターなるものを使って調査したり、
回り道でいろいろスキルがつきましたです。

« Ruby でproxyサーバ経由のSOAP/HTTP | トップページ | TCPモニタでSOAP通信をチェック »

Ruby」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/34023/16492412

この記事へのトラックバック一覧です: RailgoをRubyで使う(パート2):

« Ruby でproxyサーバ経由のSOAP/HTTP | トップページ | TCPモニタでSOAP通信をチェック »

Haruya's Violin

2018年6月
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30

最近のトラックバック

無料ブログはココログ