Skip to content

Instantly share code, notes, and snippets.

@joakimk
Created January 17, 2012 19:20
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save joakimk/1628294 to your computer and use it in GitHub Desktop.
Save joakimk/1628294 to your computer and use it in GitHub Desktop.
Economic API-client experiment
require 'rubygems'
require 'savon'
require 'active_support'
require 'active_support/core_ext'
require 'json'
# Don't mention the adapter!
HTTPI.log = false
# Log pretty JSON instead of XML, and never mind URL and headers.
if true
class Savon::SOAP::Request
def log_request(url, headers, body)
end
def log_response(code, body)
end
end
else
class Savon::SOAP::Request
def log_request(url, headers, body)
Savon.log ""
Savon.log ">> REQUEST:"
log_soap_prettily body
end
def log_response(code, body)
Savon.log ""
Savon.log "<< RESPONSE:"
log_soap_prettily body
Savon.log ""
Savon.log "-"*50
end
def log_soap_prettily(soap)
# depends on json gem
hash = Hash.from_xml(soap)
body = hash["Envelope"]["Body"]
json = JSON.pretty_generate(body)
Savon.log json
end
end
end
module Econ
class Api
def initialize(agreement_number, user, password)
@agreement_number, @user, @password = agreement_number, user, password
@methods = [ "Invoice_GetData", "Debtor_GetData" ]
@client ||= Savon::Client.new do
wsdl.document = File.expand_path(File.join(File.dirname(__FILE__), "economic.wsdl"))
end
@methods.each do |method|
self.class.send(:define_method, method) do |opts|
token = connect
response = @client.request :economic, savon_method(method) do
soap.body = opts
end
response.to_hash
end
end
end
private
def savon_method(method)
method.snakecase
end
def connect
return @token if @token
response = nil
begin
agreement_number = @agreement_number
user = @user
password = @password
response = @client.request :economic, :connect do
soap.body = {
:agreementNumber => agreement_number,
:userName => user,
:password => password,
:order! => [:agreementNumber, :userName, :password]
}
end
@client.http.headers["Cookie"] = response.http.headers["Set-Cookie"]
rescue Savon::SOAP::Fault => ex
p "Error:"
p ex
end
@token = response.to_hash[:connect_response][:connect_result]
end
end
end
api = Econ::Api.new(ENV['ID'], ENV['USER'], ENV["PW"])
puts "API methods:"
p api.methods - Object.methods
puts
puts "Fetching invoice data:"
invoice = api.Invoice_GetData({ "entityHandle" => { "Number" => "14679" } })
p invoice[:invoice_get_data_response][:invoice_get_data_result][:net_amount]
puts
puts "Fetching debtor data:"
debtor = api.Debtor_GetData({ "entityHandle" => { "Number" => "308" } })
p debtor[:debtor_get_data_response][:debtor_get_data_result][:balance]
__END__
# OUTPUT:
API methods:
["Invoice_GetData", "Debtor_GetData"]
Fetching invoice data:
warning: peer certificate won't be verified in this SSL session
warning: peer certificate won't be verified in this SSL session
"1810.00"
Fetching debtor data:
warning: peer certificate won't be verified in this SSL session
"6080.00"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment