Created
January 17, 2012 19:20
-
-
Save joakimk/1628294 to your computer and use it in GitHub Desktop.
Economic API-client experiment
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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