在rails里访问webservice跟访问RSS Feeds一样简单(见本博处女作),有很多种不同的方式,SOAP,REST是最常见的2种,这里介绍一下REST方式。
【清单一】
require 'net/http'
class Expedia::Request
attr_reader :error, :ticket_str, :total
@@site = "http://www.travelnow.com"
@@path = "#{@@site}/external/xmlinterface.jsp?cid=******&resType=air&intfc=ws&xml="
def initialize(params = {})
@trip_type = params[:trip_type]
@depart_city = params[:depart_city]
@arr_city = params[:arr_city]
@depart_date = params[:depart_date]
@ret_date = params[:ret_date]
@fare_class = params[:fare_class]
@adult_passengers = params[:adult_passengers]
@senior_passengers = params[:senior_passengers]
@children = params[:children] #INF,INS,C02,C11...
end
def send
#生成需要发送的请求数据,追加在@@path后面
xml = Builder::XmlMarkup.new
request_xml = xml.AirSessionRequest(:method=>"getAirAvailability"){
xml.AirAvailabilityQuery{
xml.originCityCode(@depart_city)
xml.destinationCityCode(@arr_city)
if @ret_date != ""
xml.returnDateTime(@ret_date.to_s)
end if
# fill xml request with proper data
xml.departureDateTime(@depart_date.to_s)
xml.fareClass(@fare_class)
xml.tripType(@trip_type)
xml.searchWindow("12")
xml.Passengers{
if @adult_passengers != "0"
xml.adultPassengers(@adult_passengers)
end
if @senior_passengers != "0"
xml.seniorPassengers(@senior_passengers)
end
if @children != ""
xml.childCodes(@children)
end
}
}
}
Net::HTTP.version_1_2
#发送请求,处理返回的结果。结果是一个XML格式的字符串。
@@path = @@path + CGI.escape(request_xml)
@@path = URI.parse(@@path)
#调用HTTP.get方法是访问webservice的关键。
@ticket_str = Net::HTTP.get(@@path).gsub(/\n?\r?/,'')
end
范例程序访问的webservice是expedia提供的,如果你想运行该程序,必须用六位数字替换cid=******中的'*',详细内容请参考:
https://www.ian.com/xmldocs/xml_ws/air/airAvailList.shtml