class Ontrac::WebServices::Service
Constants
- API_BASE_URL
- Credentials
- UID
Attributes
debug_output[RW]
Public Class Methods
new(credentials, debug_output = nil)
click to toggle source
# File lib/ontrac/web_services/service.rb, line 19 def initialize(credentials, debug_output = nil) @credentials = credentials self.debug_output = debug_output end
Public Instance Methods
post_shipments(shipment_requests)
click to toggle source
# File lib/ontrac/web_services/service.rb, line 30 def post_shipments(shipment_requests) shipment_requests.map do |shipment_request| shipment_request.shipper.Contact ||= "" shipment_request.shipper.Phone ||= "" shipment_request.consignee.Addr2 ||= "" shipment_request.consignee.Addr3 ||= "" shipment_request.consignee.Contact ||= "" shipment_request.consignee.Phone ||= "" shipment_request.UID = SecureRandom.hex(16) shipment_request.COD ||= 0 shipment_request.CODType ||= Definitions::COD_TYPE_NONE shipment_request.BillTo ||= 0 shipment_request.Instructions ||= "" shipment_request.Reference ||= "" shipment_request.Reference2 ||= "" shipment_request.Reference3 ||= "" shipment_request.Tracking ||= "" shipment_request.DIM ||= Definitions::Dim.new(0, 0, 0) shipment_request.ShipEmail ||= "" shipment_request.DelEmail ||= "" end xml_builder = Nokogiri::XML::Builder.new xml_builder.OnTracShipmentRequest do |xml| xml.Shipments do |xml| shipment_requests.each do |shipment_request| xml.parent << shipment_request.to_xml("Shipment") end end end response_xml = issue_request('shipments', xml_builder.doc) shipment_requests.map do |request| uid = request.UID shipment_response = response_xml.xpath( "/OnTracShipmentResponse/Shipments/Shipment[./UID = '#{uid}']" ).first or raise ServiceException.new("Missing package response for #{uid}") label = shipment_response.xpath("Label").text label = Base64.decode64(label) if (request.LabelType == Definitions::LABEL_TYPE_PDF) [ shipment_response.xpath("Tracking").text, label, Float(shipment_response.xpath("TotalChrg").text) ] end end
service_url(service_name)
click to toggle source
# File lib/ontrac/web_services/service.rb, line 24 def service_url(service_name) "%s/%s/%s?pw=%s" % [ API_BASE_URL, @credentials.account, service_name, CGI.escape(@credentials.password) ] end
Private Instance Methods
check_response(response_xml)
click to toggle source
# File lib/ontrac/web_services/service.rb, line 94 def check_response(response_xml) root_error = response_xml.xpath("/OnTracShipmentResponse/Error").text erred_shipments = response_xml.xpath("//Shipment[./Error != '']") return if (root_error.empty? && erred_shipments.empty?) err = ServiceException.new("OnTrac responded with an error") err.root_error = root_error err.sub_errors = Hash[ erred_shipments.map do |shipment_response| [ shipment_response.xpath("./UID").text, shipment_response.xpath("./Error").text ] end ] raise err end
issue_request(service_name, request_xml)
click to toggle source
# File lib/ontrac/web_services/service.rb, line 81 def issue_request(service_name, request_xml) uri = URI.parse(service_url(service_name)) http = Net::HTTP.new(uri.host, uri.port) http.set_debug_output(debug_output) if (debug_output) http.use_ssl = true response = http.request_post(uri.request_uri, request_xml.to_s) response_xml = Nokogiri::XML(response.body) check_response(response_xml) response_xml end