savon 0.7.5 → 0.7.6
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +11 -0
- data/README.rdoc +5 -3
- data/Rakefile +2 -0
- data/lib/savon.rb +1 -0
- data/lib/savon/client.rb +54 -13
- data/lib/savon/core_ext.rb +0 -0
- data/lib/savon/core_ext/array.rb +20 -6
- data/lib/savon/core_ext/datetime.rb +0 -0
- data/lib/savon/core_ext/hash.rb +36 -15
- data/lib/savon/core_ext/net_http.rb +1 -2
- data/lib/savon/core_ext/object.rb +1 -3
- data/lib/savon/core_ext/string.rb +9 -2
- data/lib/savon/core_ext/symbol.rb +0 -0
- data/lib/savon/core_ext/uri.rb +1 -1
- data/lib/savon/logger.rb +56 -0
- data/lib/savon/request.rb +42 -50
- data/lib/savon/response.rb +62 -9
- data/lib/savon/soap.rb +157 -42
- data/lib/savon/wsdl.rb +71 -6
- data/lib/savon/wsdl_stream.rb +2 -2
- data/lib/savon/wsse.rb +36 -5
- data/spec/basic_spec_helper.rb +0 -0
- data/spec/endpoint_helper.rb +0 -0
- data/spec/fixtures/response/response_fixture.rb +0 -0
- data/spec/fixtures/response/xml/authentication.xml +0 -0
- data/spec/fixtures/response/xml/multi_ref.xml +0 -0
- data/spec/fixtures/response/xml/soap_fault.xml +0 -0
- data/spec/fixtures/response/xml/soap_fault12.xml +0 -0
- data/spec/fixtures/wsdl/wsdl_fixture.rb +0 -0
- data/spec/fixtures/wsdl/xml/authentication.xml +0 -0
- data/spec/fixtures/wsdl/xml/geotrust.xml +0 -0
- data/spec/fixtures/wsdl/xml/namespaced_actions.xml +0 -0
- data/spec/fixtures/wsdl/xml/no_namespace.xml +0 -0
- data/spec/http_stubs.rb +0 -0
- data/spec/integration/http_basic_auth_spec.rb +0 -0
- data/spec/integration/server.rb +0 -0
- data/spec/savon/client_spec.rb +5 -1
- data/spec/savon/core_ext/array_spec.rb +0 -0
- data/spec/savon/core_ext/datetime_spec.rb +0 -0
- data/spec/savon/core_ext/hash_spec.rb +10 -1
- data/spec/savon/core_ext/net_http_spec.rb +0 -0
- data/spec/savon/core_ext/object_spec.rb +0 -0
- data/spec/savon/core_ext/string_spec.rb +6 -2
- data/spec/savon/core_ext/symbol_spec.rb +0 -0
- data/spec/savon/core_ext/uri_spec.rb +4 -0
- data/spec/savon/request_spec.rb +5 -4
- data/spec/savon/response_spec.rb +0 -0
- data/spec/savon/soap_spec.rb +124 -130
- data/spec/savon/wsdl_spec.rb +0 -0
- data/spec/savon/wsse_spec.rb +0 -0
- data/spec/spec_helper.rb +0 -0
- metadata +55 -37
- data/readme/client.rdoc +0 -18
- data/readme/errors.rdoc +0 -11
- data/readme/logging.rdoc +0 -11
- data/readme/participate.rdoc +0 -21
- data/readme/request.rdoc +0 -37
- data/readme/response.rdoc +0 -46
- data/readme/soap.rdoc +0 -71
- data/readme/value_mapping.rdoc +0 -49
- data/readme/wsdl.rdoc +0 -39
- data/readme/wsse.rdoc +0 -28
data/spec/savon/wsdl_spec.rb
CHANGED
File without changes
|
data/spec/savon/wsse_spec.rb
CHANGED
File without changes
|
data/spec/spec_helper.rb
CHANGED
File without changes
|
metadata
CHANGED
@@ -1,7 +1,12 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: savon
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 7
|
8
|
+
- 6
|
9
|
+
version: 0.7.6
|
5
10
|
platform: ruby
|
6
11
|
authors:
|
7
12
|
- Daniel Harrington
|
@@ -9,59 +14,79 @@ autorequire:
|
|
9
14
|
bindir: bin
|
10
15
|
cert_chain: []
|
11
16
|
|
12
|
-
date: 2010-
|
17
|
+
date: 2010-03-21 00:00:00 +01:00
|
13
18
|
default_executable:
|
14
19
|
dependencies:
|
15
20
|
- !ruby/object:Gem::Dependency
|
16
21
|
name: builder
|
17
|
-
|
18
|
-
|
19
|
-
version_requirements: !ruby/object:Gem::Requirement
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
20
24
|
requirements:
|
21
25
|
- - ">="
|
22
26
|
- !ruby/object:Gem::Version
|
27
|
+
segments:
|
28
|
+
- 2
|
29
|
+
- 1
|
30
|
+
- 2
|
23
31
|
version: 2.1.2
|
24
|
-
|
32
|
+
type: :runtime
|
33
|
+
version_requirements: *id001
|
25
34
|
- !ruby/object:Gem::Dependency
|
26
35
|
name: crack
|
27
|
-
|
28
|
-
|
29
|
-
version_requirements: !ruby/object:Gem::Requirement
|
36
|
+
prerelease: false
|
37
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
30
38
|
requirements:
|
31
39
|
- - ">="
|
32
40
|
- !ruby/object:Gem::Version
|
41
|
+
segments:
|
42
|
+
- 0
|
43
|
+
- 1
|
44
|
+
- 4
|
33
45
|
version: 0.1.4
|
34
|
-
|
46
|
+
type: :runtime
|
47
|
+
version_requirements: *id002
|
35
48
|
- !ruby/object:Gem::Dependency
|
36
49
|
name: rspec
|
37
|
-
|
38
|
-
|
39
|
-
version_requirements: !ruby/object:Gem::Requirement
|
50
|
+
prerelease: false
|
51
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
40
52
|
requirements:
|
41
53
|
- - ">="
|
42
54
|
- !ruby/object:Gem::Version
|
55
|
+
segments:
|
56
|
+
- 1
|
57
|
+
- 2
|
58
|
+
- 8
|
43
59
|
version: 1.2.8
|
44
|
-
|
60
|
+
type: :development
|
61
|
+
version_requirements: *id003
|
45
62
|
- !ruby/object:Gem::Dependency
|
46
63
|
name: mocha
|
47
|
-
|
48
|
-
|
49
|
-
version_requirements: !ruby/object:Gem::Requirement
|
64
|
+
prerelease: false
|
65
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
50
66
|
requirements:
|
51
67
|
- - ">="
|
52
68
|
- !ruby/object:Gem::Version
|
69
|
+
segments:
|
70
|
+
- 0
|
71
|
+
- 9
|
72
|
+
- 7
|
53
73
|
version: 0.9.7
|
54
|
-
|
74
|
+
type: :development
|
75
|
+
version_requirements: *id004
|
55
76
|
- !ruby/object:Gem::Dependency
|
56
77
|
name: fakeweb
|
57
|
-
|
58
|
-
|
59
|
-
version_requirements: !ruby/object:Gem::Requirement
|
78
|
+
prerelease: false
|
79
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
60
80
|
requirements:
|
61
81
|
- - ">="
|
62
82
|
- !ruby/object:Gem::Version
|
83
|
+
segments:
|
84
|
+
- 1
|
85
|
+
- 2
|
86
|
+
- 7
|
63
87
|
version: 1.2.7
|
64
|
-
|
88
|
+
type: :development
|
89
|
+
version_requirements: *id005
|
65
90
|
description:
|
66
91
|
email: me@rubiii.com
|
67
92
|
executables: []
|
@@ -84,6 +109,7 @@ files:
|
|
84
109
|
- lib/savon/core_ext/symbol.rb
|
85
110
|
- lib/savon/core_ext/uri.rb
|
86
111
|
- lib/savon/core_ext.rb
|
112
|
+
- lib/savon/logger.rb
|
87
113
|
- lib/savon/request.rb
|
88
114
|
- lib/savon/response.rb
|
89
115
|
- lib/savon/soap.rb
|
@@ -121,16 +147,6 @@ files:
|
|
121
147
|
- spec/fixtures/wsdl/xml/geotrust.xml
|
122
148
|
- spec/fixtures/wsdl/xml/namespaced_actions.xml
|
123
149
|
- spec/fixtures/wsdl/xml/no_namespace.xml
|
124
|
-
- readme/client.rdoc
|
125
|
-
- readme/errors.rdoc
|
126
|
-
- readme/logging.rdoc
|
127
|
-
- readme/participate.rdoc
|
128
|
-
- readme/request.rdoc
|
129
|
-
- readme/response.rdoc
|
130
|
-
- readme/soap.rdoc
|
131
|
-
- readme/value_mapping.rdoc
|
132
|
-
- readme/wsdl.rdoc
|
133
|
-
- readme/wsse.rdoc
|
134
150
|
has_rdoc: true
|
135
151
|
homepage: http://github.com/rubiii/savon
|
136
152
|
licenses: []
|
@@ -138,28 +154,30 @@ licenses: []
|
|
138
154
|
post_install_message:
|
139
155
|
rdoc_options:
|
140
156
|
- --charset=UTF-8
|
141
|
-
- --title
|
142
|
-
- Savon
|
143
157
|
- --line-numbers
|
144
158
|
- --inline-source
|
159
|
+
- --title
|
160
|
+
- Savon - Heavy metal Ruby SOAP client library
|
145
161
|
require_paths:
|
146
162
|
- lib
|
147
163
|
required_ruby_version: !ruby/object:Gem::Requirement
|
148
164
|
requirements:
|
149
165
|
- - ">="
|
150
166
|
- !ruby/object:Gem::Version
|
167
|
+
segments:
|
168
|
+
- 0
|
151
169
|
version: "0"
|
152
|
-
version:
|
153
170
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
154
171
|
requirements:
|
155
172
|
- - ">="
|
156
173
|
- !ruby/object:Gem::Version
|
174
|
+
segments:
|
175
|
+
- 0
|
157
176
|
version: "0"
|
158
|
-
version:
|
159
177
|
requirements: []
|
160
178
|
|
161
179
|
rubyforge_project:
|
162
|
-
rubygems_version: 1.3.
|
180
|
+
rubygems_version: 1.3.6
|
163
181
|
signing_key:
|
164
182
|
specification_version: 3
|
165
183
|
summary: Heavy metal Ruby SOAP client library
|
data/readme/client.rdoc
DELETED
@@ -1,18 +0,0 @@
|
|
1
|
-
Savon::Client is the main object to connect to a SOAP service. It includes methods to access both Savon::WSDL and Savon::Request objects.
|
2
|
-
|
3
|
-
== Instantiate Savon::Client
|
4
|
-
|
5
|
-
Depending on whether you aim to use Savon with or without Savon::WSDL, you need to instantiate Savon::Client by passing in the WSDL or SOAP endpoint.
|
6
|
-
|
7
|
-
# Client instance with a WSDL endpoint
|
8
|
-
client = Savon::Client.new "http://example.com/UserService?wsdl"
|
9
|
-
|
10
|
-
# Client instance with a SOAP endpoint (for using Savon without a WSDL)
|
11
|
-
client = Savon::Client.new "http://example.com/UserService"
|
12
|
-
|
13
|
-
== Using a proxy server
|
14
|
-
|
15
|
-
You can specify the URI to a proxy server via optional Hash arguments.
|
16
|
-
|
17
|
-
client = Savon::Client.new "http://example.com/UserService?wsdl",
|
18
|
-
:proxy => "http://proxy.example.com"
|
data/readme/errors.rdoc
DELETED
@@ -1,11 +0,0 @@
|
|
1
|
-
== HTTP errors
|
2
|
-
|
3
|
-
In case of an HTTP error, a Savon::HTTPError will be raised. Any HTTP response code >= 300 raises this error. The only exception to this rule is when the server also returns a SOAP fault. In this case, a Savon::SOAPFault is raised.
|
4
|
-
|
5
|
-
== SOAP faults
|
6
|
-
|
7
|
-
A Savon::SOAPFault is raised in case the server returned a SOAP fault.
|
8
|
-
|
9
|
-
== Rails tip
|
10
|
-
|
11
|
-
In case you're using Savon inside a Rails application, you can use {rescue_from}[http://api.rubyonrails.org/classes/ActiveSupport/Rescuable/ClassMethods.html] to handle these errors
|
data/readme/logging.rdoc
DELETED
@@ -1,11 +0,0 @@
|
|
1
|
-
Savon logs each request and response to STDOUT. Specifying your own logger is as easy as it gets:
|
2
|
-
|
3
|
-
Savon::Request.logger = RAILS_DEFAULT_LOGGER
|
4
|
-
|
5
|
-
The default log level is set to :debug. In case you need to change this:
|
6
|
-
|
7
|
-
Savon::Request.log_level = :info
|
8
|
-
|
9
|
-
You can also disable logging if you need to:
|
10
|
-
|
11
|
-
Savon::Request.log = false
|
data/readme/participate.rdoc
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
== Provide feedback
|
2
|
-
|
3
|
-
Let me know about your experiences using Savon. What's good, what's not? {Open an issue}[http://github.com/rubiii/savon/issues] if you encounter a bug. Feedback is always appreciated.
|
4
|
-
|
5
|
-
== Spread the word
|
6
|
-
|
7
|
-
Let others know about Savon by talking, tweeting or blogging about it. The more people use Savon, the more stable it becomes.
|
8
|
-
|
9
|
-
== Fix bugs or implement features
|
10
|
-
|
11
|
-
You're welcome to fork the project to fix bugs, implement features, etc. But please make sure to follow "the rules":
|
12
|
-
|
13
|
-
* Follow the coding and naming conventions of the code
|
14
|
-
* Do not edit the CHANGELOG and .gemspec files
|
15
|
-
* Test all the fucking time!
|
16
|
-
|
17
|
-
Also, if you're thinking about adding some big new feature or if you're not sure about how to implement it, please just get in touch.
|
18
|
-
|
19
|
-
Please note that Savon {does not require Rubygems}[http://gist.github.com/54177]. So make sure your environment is set up to load the package manager of your choice. In order to run autospec, you could use the following alias:
|
20
|
-
|
21
|
-
alias autospec='RUBYLIB=./lib RUBYOPT=-rubygems AUTOFEATURE=true autospec'
|
data/readme/request.rdoc
DELETED
@@ -1,37 +0,0 @@
|
|
1
|
-
Savon::Request handles both WSDL and SOAP requests.
|
2
|
-
|
3
|
-
== The Net::HTTP object
|
4
|
-
|
5
|
-
You can access the Net::HTTP object used for both WSDL and SOAP requests via:
|
6
|
-
|
7
|
-
client.request.http
|
8
|
-
|
9
|
-
Here's an example of how to set open and read timeouts on the Net::HTTP object.
|
10
|
-
|
11
|
-
client.request.http.open_timeout = 30
|
12
|
-
client.request.http.read_timeout = 30
|
13
|
-
|
14
|
-
Please refer to the {official documentation}[http://www.ruby-doc.org/stdlib/libdoc/net/http/rdoc/index.html] for more information.
|
15
|
-
|
16
|
-
== HTTP basic authentication
|
17
|
-
|
18
|
-
Setting credentials for HTTP basic authentication:
|
19
|
-
|
20
|
-
client.request.basic_auth "username", "password"
|
21
|
-
|
22
|
-
== SSL client authentication
|
23
|
-
|
24
|
-
You can use the methods provided by Net::HTTP to set SSL client authentication or use this shortcut:
|
25
|
-
|
26
|
-
client.request.http.ssl_client_auth(
|
27
|
-
:cert => OpenSSL::X509::Certificate.new(File.read("client_cert.pem")),
|
28
|
-
:key => OpenSSL::PKey::RSA.new(File.read("client_key.pem"), "password if one exists"),
|
29
|
-
:ca_file => "cacert.pem",
|
30
|
-
:verify_mode => OpenSSL::SSL::VERIFY_PEER
|
31
|
-
)
|
32
|
-
|
33
|
-
== HTTP headers
|
34
|
-
|
35
|
-
There's an accessor for the Hash of HTTP headers sent with any SOAP call:
|
36
|
-
|
37
|
-
client.request.headers["custom"] = "header"
|
data/readme/response.rdoc
DELETED
@@ -1,46 +0,0 @@
|
|
1
|
-
The response is wrapped in an object to give you various options of handling it.
|
2
|
-
|
3
|
-
== SOAP fault
|
4
|
-
|
5
|
-
Assuming the default behavior of raising errors is disabled, you can ask the response object if there was a SOAP fault or an HTTP error and get the SOAP fault or HTTP error message.
|
6
|
-
|
7
|
-
response.soap_fault?
|
8
|
-
=> true
|
9
|
-
|
10
|
-
response.soap_fault
|
11
|
-
=> "(soap:Server) Fault occurred while processing."
|
12
|
-
|
13
|
-
response.http_error?
|
14
|
-
=> true
|
15
|
-
|
16
|
-
response.http_error
|
17
|
-
=> "Not found (404)"
|
18
|
-
|
19
|
-
== Response as XML
|
20
|
-
|
21
|
-
To get the raw SOAP response XML, you can call to_xml or to_s on the response object.
|
22
|
-
|
23
|
-
response.to_xml
|
24
|
-
=> "<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
|
25
|
-
=> "..."
|
26
|
-
=> "</soap:Envelope>"
|
27
|
-
|
28
|
-
== Response as a Hash
|
29
|
-
|
30
|
-
You can also let Savon translate the SOAP response body to a Hash.
|
31
|
-
|
32
|
-
response.to_hash
|
33
|
-
=> { :findUserByIdResponse => {
|
34
|
-
=> :id => "666",
|
35
|
-
=> :username => "thedude"
|
36
|
-
=> :firstname => "The",
|
37
|
-
=> :lastname => "Dude",
|
38
|
-
=> :active => true
|
39
|
-
=> }
|
40
|
-
|
41
|
-
== Net::HTTP response
|
42
|
-
|
43
|
-
If for reason you need to access the Net::HTTP response object ... you can.
|
44
|
-
|
45
|
-
bc. response.http
|
46
|
-
=> #<Net::HTTPOK:0x7f749a1aa4a8>
|
data/readme/soap.rdoc
DELETED
@@ -1,71 +0,0 @@
|
|
1
|
-
Savon::SOAP represents the SOAP request. Pass a block to your SOAP call and the SOAP object is passed to it as the first argument. The object allows setting the SOAP version, header, body and namespaces per request.
|
2
|
-
|
3
|
-
== Body
|
4
|
-
|
5
|
-
The body method lets you specify parameters to be received by the SOAP action. The value is expected to be a Hash (which will be translated to XML via Hash.to_soap_xml) or an XML String.
|
6
|
-
|
7
|
-
response = client.get_user_by_id do |soap|
|
8
|
-
soap.body = { :id => 666 }
|
9
|
-
end
|
10
|
-
|
11
|
-
response = client.get_user_by_id do |soap|
|
12
|
-
soap.body = "<id>666</id>"
|
13
|
-
end
|
14
|
-
|
15
|
-
In case your service requires the elements to be in a specific order, you have two options. The first is to specify your body as an XML String. The second is to add an ":order!" key containing an Array of elements in the specific order to your Hash. Here's an example:
|
16
|
-
|
17
|
-
response = client.add_user do |soap|
|
18
|
-
soap.body = { :user => { :name => "Lucy", :id => 666, :order! => [:id, :name] } }
|
19
|
-
end
|
20
|
-
|
21
|
-
== Version
|
22
|
-
|
23
|
-
Savon defaults to SOAP 1.1. In case your service uses SOAP 1.2, you can use the version method to change the default.
|
24
|
-
|
25
|
-
response = client.get_all_users do |soap|
|
26
|
-
soap.version = 2
|
27
|
-
end
|
28
|
-
|
29
|
-
You can also change the default to SOAP 1.2 for all request:
|
30
|
-
|
31
|
-
Savon::SOAP.version = 2
|
32
|
-
|
33
|
-
== Header
|
34
|
-
|
35
|
-
If you need to add custom XML into the SOAP header, you can use the header method. The value is expected to be a Hash (which will be translated to XML via Hash.to_soap_xml) or an XML String.
|
36
|
-
|
37
|
-
response = client.get_all_users do |soap|
|
38
|
-
soap.header["specialApiKey"] = "secret"
|
39
|
-
end
|
40
|
-
|
41
|
-
response = client.get_all_users do |soap|
|
42
|
-
soap.header = "<specialApiKey>secret</specialApiKey>"
|
43
|
-
end
|
44
|
-
|
45
|
-
== Namespaces
|
46
|
-
|
47
|
-
The namespaces method contains a Hash of namespaces for the SOAP envelope.
|
48
|
-
|
49
|
-
response = client.get_all_users do |soap|
|
50
|
-
soap.namespaces["xmlns:whatever"] = "http://example.com"
|
51
|
-
end
|
52
|
-
|
53
|
-
== Input
|
54
|
-
|
55
|
-
You can change the name of the SOAP input node in case you need to.
|
56
|
-
|
57
|
-
response = client.get_all_users do |soap|
|
58
|
-
soap.input = "GetAllUsersRequest"
|
59
|
-
end
|
60
|
-
|
61
|
-
The request is going to look something like this:
|
62
|
-
|
63
|
-
=> <env:Envelope
|
64
|
-
=> xmlns:wsdl="http://example.com/user/1.0/UserService"
|
65
|
-
=> xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
|
66
|
-
=> <env:Header></env:Header>
|
67
|
-
=> <env:Body>
|
68
|
-
=> <wsdl:GetAllUsersRequest></wsdl:GetAllUsersRequest>
|
69
|
-
=> </env:Body>
|
70
|
-
=> </env:Envelope>
|
71
|
-
|
data/readme/value_mapping.rdoc
DELETED
@@ -1,49 +0,0 @@
|
|
1
|
-
Of course both SOAP request and response are pure XML. Even though (assuming your XML applies to some defaults), Savon lets you specify the SOAP header and body as a Hash as well as returning the [[Response]] as a Hash.
|
2
|
-
|
3
|
-
== SOAP header and body
|
4
|
-
|
5
|
-
Some Hash keys and values passed to [[SOAP]] header and body are converted to SOAP compatible values automatically.
|
6
|
-
|
7
|
-
* Hash keys specified as Symbols are converted to lowerCamelCase Strings
|
8
|
-
* Hash keys specified as Strings are not converted and may contain namespaces
|
9
|
-
* DateTime Hash values are converted to xs:dateTime Strings
|
10
|
-
* Objects respond to to_datetime (except Strings) are converted to xs:dateTime Strings
|
11
|
-
* TrueClass and FalseClass objects are converted to "true" and "false"
|
12
|
-
* All other objects are expected to be converted to Strings using to_s
|
13
|
-
|
14
|
-
Example:
|
15
|
-
|
16
|
-
date = DateTime.new 2010, 11, 22, 11, 22, 33
|
17
|
-
response = client.user_magic do |soap|
|
18
|
-
soap.body = {
|
19
|
-
:magic_request => {
|
20
|
-
:perform_move => true,
|
21
|
-
"perform_at" => date
|
22
|
-
}
|
23
|
-
}
|
24
|
-
end
|
25
|
-
|
26
|
-
Request:
|
27
|
-
|
28
|
-
<env:Envelope
|
29
|
-
xmlns:wsdl="http://ws.user.example.com"
|
30
|
-
xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
|
31
|
-
<env:Header></env:Header>
|
32
|
-
<env:Body>
|
33
|
-
<wsdl:userMagic>
|
34
|
-
<magicRequest>
|
35
|
-
<performMove>true</performMove>
|
36
|
-
<perform_at>2012-06-11T10:42:21</perform_at>
|
37
|
-
</magicRequest>
|
38
|
-
</wsdl:userMagic>
|
39
|
-
</env:Body>
|
40
|
-
</env:Envelope>
|
41
|
-
|
42
|
-
== SOAP response as a Hash
|
43
|
-
|
44
|
-
When translating the SOAP response to a Hash, some XML nodes and values are converted to more convenient Ruby objects. Translation is done using John Nunemaker's {Crack}[http://github.com/jnunemaker/crack] library. Afterward, Savon does some extra mapping.
|
45
|
-
|
46
|
-
* Hash keys get converted to snake_case Symbols and namespaces are stripped off
|
47
|
-
* SOAP nil values are converted to nil
|
48
|
-
* Hash values specified in xs:DateTime format are converted to DateTime objects
|
49
|
-
* Hash values of "true" and "false" are converted to TrueClass and FalseClass
|