savon 0.7.5 → 0.7.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|