julianmorrison-savon 0.6.8

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.
Files changed (42) hide show
  1. data/CHANGELOG +92 -0
  2. data/README.textile +71 -0
  3. data/Rakefile +27 -0
  4. data/lib/savon.rb +34 -0
  5. data/lib/savon/client.rb +84 -0
  6. data/lib/savon/core_ext.rb +3 -0
  7. data/lib/savon/core_ext/datetime.rb +8 -0
  8. data/lib/savon/core_ext/hash.rb +78 -0
  9. data/lib/savon/core_ext/object.rb +21 -0
  10. data/lib/savon/core_ext/string.rb +47 -0
  11. data/lib/savon/core_ext/symbol.rb +8 -0
  12. data/lib/savon/core_ext/uri.rb +10 -0
  13. data/lib/savon/request.rb +159 -0
  14. data/lib/savon/response.rb +108 -0
  15. data/lib/savon/soap.rb +138 -0
  16. data/lib/savon/wsdl.rb +122 -0
  17. data/lib/savon/wsse.rb +122 -0
  18. data/spec/endpoint_helper.rb +22 -0
  19. data/spec/fixtures/response/response_fixture.rb +32 -0
  20. data/spec/fixtures/response/xml/authentication.xml +14 -0
  21. data/spec/fixtures/response/xml/soap_fault.xml +8 -0
  22. data/spec/fixtures/response/xml/soap_fault12.xml +18 -0
  23. data/spec/fixtures/wsdl/wsdl_fixture.rb +37 -0
  24. data/spec/fixtures/wsdl/xml/authentication.xml +63 -0
  25. data/spec/fixtures/wsdl/xml/namespaced_actions.xml +307 -0
  26. data/spec/fixtures/wsdl/xml/no_namespace.xml +115 -0
  27. data/spec/http_stubs.rb +23 -0
  28. data/spec/savon/client_spec.rb +83 -0
  29. data/spec/savon/core_ext/datetime_spec.rb +12 -0
  30. data/spec/savon/core_ext/hash_spec.rb +134 -0
  31. data/spec/savon/core_ext/object_spec.rb +40 -0
  32. data/spec/savon/core_ext/string_spec.rb +68 -0
  33. data/spec/savon/core_ext/symbol_spec.rb +11 -0
  34. data/spec/savon/core_ext/uri_spec.rb +15 -0
  35. data/spec/savon/request_spec.rb +124 -0
  36. data/spec/savon/response_spec.rb +122 -0
  37. data/spec/savon/savon_spec.rb +23 -0
  38. data/spec/savon/soap_spec.rb +131 -0
  39. data/spec/savon/wsdl_spec.rb +84 -0
  40. data/spec/savon/wsse_spec.rb +132 -0
  41. data/spec/spec_helper.rb +16 -0
  42. metadata +166 -0
@@ -0,0 +1,122 @@
1
+ module Savon
2
+
3
+ # Savon::WSSE
4
+ #
5
+ # Represents parameters for WSSE authentication.
6
+ class WSSE
7
+
8
+ # Namespace for WS Security Secext.
9
+ WSENamespace = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
10
+
11
+ # Namespace for WS Security Utility.
12
+ WSUNamespace = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
13
+
14
+ # Global WSSE username.
15
+ @@username = nil
16
+
17
+ # Returns the global WSSE username.
18
+ def self.username
19
+ @@username
20
+ end
21
+
22
+ # Sets the global WSSE username.
23
+ def self.username=(username)
24
+ @@username = username.to_s if username.respond_to? :to_s
25
+ @@username = nil if username.nil?
26
+ end
27
+
28
+ # Global WSSE password.
29
+ @@password = nil
30
+
31
+ # Returns the global WSSE password.
32
+ def self.password
33
+ @@password
34
+ end
35
+
36
+ # Sets the global WSSE password.
37
+ def self.password=(password)
38
+ @@password = password.to_s if password.respond_to? :to_s
39
+ @@password = nil if password.nil?
40
+ end
41
+
42
+ # Global setting of whether to use WSSE digest.
43
+ @@digest = false
44
+
45
+ # Returns the global setting of whether to use WSSE digest.
46
+ def self.digest?
47
+ @@digest
48
+ end
49
+
50
+ # Global setting of whether to use WSSE digest.
51
+ def self.digest=(digest)
52
+ @@digest = digest
53
+ end
54
+
55
+ # Sets the WSSE username per request.
56
+ def username=(username)
57
+ @username = username.to_s if username.respond_to? :to_s
58
+ @username = nil if username.nil?
59
+ end
60
+
61
+ # Returns the WSSE username. Defaults to the global setting.
62
+ def username
63
+ @username || self.class.username
64
+ end
65
+
66
+ # Sets the WSSE password per request.
67
+ def password=(password)
68
+ @password = password.to_s if password.respond_to? :to_s
69
+ @password = nil if password.nil?
70
+ end
71
+
72
+ # Returns the WSSE password. Defaults to the global setting.
73
+ def password
74
+ @password || self.class.password
75
+ end
76
+
77
+ # Sets whether to use WSSE digest per request.
78
+ attr_writer :digest
79
+
80
+ # Returns whether to use WSSE digest. Defaults to the global setting.
81
+ def digest?
82
+ @digest || self.class.digest?
83
+ end
84
+
85
+ # Returns the XML for a WSSE header or an empty String unless both
86
+ # username and password were specified.
87
+ def header
88
+ return "" unless username && password
89
+
90
+ builder = Builder::XmlMarkup.new
91
+ builder.wsse :Security, "xmlns:wsse" => WSENamespace do |xml|
92
+ xml.wsse :UsernameToken, "xmlns:wsu" => WSUNamespace do
93
+ xml.wsse :Username, username
94
+ xml.wsse :Nonce, nonce
95
+ xml.wsu :Created, timestamp
96
+ xml.wsse :Password, password_node
97
+ end
98
+ end
99
+ end
100
+
101
+ private
102
+
103
+ # Returns the WSSE password. Encrypts the password for digest authentication.
104
+ def password_node
105
+ return password unless digest?
106
+
107
+ token = nonce + timestamp + password
108
+ Base64.encode64(Digest::SHA1.hexdigest(token)).chomp!
109
+ end
110
+
111
+ # Returns a WSSE nonce.
112
+ def nonce
113
+ @nonce ||= Digest::SHA1.hexdigest String.random + timestamp
114
+ end
115
+
116
+ # Returns a WSSE timestamp.
117
+ def timestamp
118
+ @timestamp ||= Time.now.strftime Savon::SOAPDateTimeFormat
119
+ end
120
+
121
+ end
122
+ end
@@ -0,0 +1,22 @@
1
+ class EndpointHelper
2
+
3
+ # Returns the WSDL endpoint for a given +type+ of request.
4
+ def self.wsdl_endpoint(type = nil)
5
+ case type
6
+ when :no_namespace then "http://nons.example.com/Service?wsdl"
7
+ when :namespaced_actions then "http://nsactions.example.com/Service?wsdl"
8
+ else soap_endpoint(type) + "?wsdl"
9
+ end
10
+ end
11
+
12
+ # Returns the SOAP endpoint for a given +type+ of request.
13
+ def self.soap_endpoint(type = nil)
14
+ case type
15
+ when :soap_fault then "http://soapfault.example.com/Service"
16
+ when :http_error then "http://httperror.example.com/Service"
17
+ when :invalid then "http://invalid.example.com/Service"
18
+ else "http://example.com/validation/1.0/AuthenticationService"
19
+ end
20
+ end
21
+
22
+ end
@@ -0,0 +1,32 @@
1
+ class ResponseFixture
2
+
3
+ def self.authentication(value = nil)
4
+ case value
5
+ when :to_hash
6
+ { :success => true,
7
+ :authentication_value => {
8
+ :token => "a68d1d6379b62ff339a0e0c69ed4d9cf",
9
+ :token_hash => "AAAJxA;cIedoT;mY10ExZwG6JuKgp2OYKxow==",
10
+ :client => "radclient"
11
+ }
12
+ }
13
+ else
14
+ @@authentication ||= load_fixture :authentication
15
+ end
16
+ end
17
+
18
+ def self.soap_fault
19
+ @@soap_fault ||= load_fixture :soap_fault
20
+ end
21
+
22
+ def self.soap_fault12
23
+ @@soap_fault12 ||= load_fixture :soap_fault12
24
+ end
25
+
26
+ private
27
+
28
+ def self.load_fixture(fixture)
29
+ File.read(File.dirname(__FILE__) + "/xml/#{fixture}.xml")
30
+ end
31
+
32
+ end
@@ -0,0 +1,14 @@
1
+ <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
2
+ <soap:Body>
3
+ <ns2:authenticateResponse xmlns:ns2="http://v1_0.ws.user.example.com">
4
+ <return>
5
+ <authenticationValue>
6
+ <token>a68d1d6379b62ff339a0e0c69ed4d9cf</token>
7
+ <tokenHash>AAAJxA;cIedoT;mY10ExZwG6JuKgp2OYKxow==</tokenHash>
8
+ <client>radclient</client>
9
+ </authenticationValue>
10
+ <success>true</success>
11
+ </return>
12
+ </ns2:authenticateResponse>
13
+ </soap:Body>
14
+ </soap:Envelope>
@@ -0,0 +1,8 @@
1
+ <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
2
+ <soap:Body>
3
+ <soap:Fault>
4
+ <faultcode>soap:Server</faultcode>
5
+ <faultstring>Fault occurred while processing.</faultstring>
6
+ </soap:Fault>
7
+ </soap:Body>
8
+ </soap:Envelope>
@@ -0,0 +1,18 @@
1
+ <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:m="http://www.example.org/timeouts">
2
+ <soap:Body>
3
+ <soap:Fault>
4
+ <Code>
5
+ <Value>soap:Sender</Value>
6
+ <Subcode>
7
+ <Value>m:MessageTimeout</Value>
8
+ </Subcode>
9
+ </Code>
10
+ <Reason>
11
+ <Text xml:lang="en">Sender Timeout</Text>
12
+ </Reason>
13
+ <Detail>
14
+ <m:MaxTime>P5M</m:MaxTime>
15
+ </Detail>
16
+ </soap:Fault>
17
+ </soap:Body>
18
+ </soap:Envelope>
@@ -0,0 +1,37 @@
1
+ require "yaml"
2
+ require "erb"
3
+
4
+ class WSDLFixture
5
+
6
+ # Returns a WSDL document matching a given +method+ name when called without
7
+ # arguments. Otherwise returns the expected value for a given +method+ name
8
+ # matching a fixture.
9
+ def self.method_missing(method, *args)
10
+ return wsdl(method) unless args.first
11
+ expectations[method][args.first]
12
+ end
13
+
14
+ private
15
+
16
+ @@expectations = nil
17
+
18
+ # Returns a Hash of expected namespace URI's and SOAP operations loaded
19
+ # from wsdl_fixture.yml.
20
+ def self.expectations
21
+ return @@expectations if @@expectations
22
+
23
+ file = File.read(File.dirname(__FILE__) + "/wsdl_fixture.yml")
24
+ @@expectations = YAML.load ERB.new(file).result
25
+ end
26
+
27
+ @@wsdl = {}
28
+
29
+ # Returns the WSDL document by a given file name.
30
+ def self.wsdl(wsdl)
31
+ return @@wsdl[wsdl] if @@wsdl[wsdl]
32
+
33
+ file = File.read(File.dirname(__FILE__) + "/xml/#{wsdl}.xml")
34
+ @@wsdl[wsdl] = file
35
+ end
36
+
37
+ end
@@ -0,0 +1,63 @@
1
+ <?xml version='1.0' encoding='UTF-8'?><wsdl:definitions name="AuthenticationWebServiceImplService" targetNamespace="http://v1_0.ws.auth.order.example.com/" xmlns:ns1="http://cxf.apache.org/bindings/xformat" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://v1_0.ws.auth.order.example.com/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
2
+ <wsdl:types>
3
+ <xs:schema attributeFormDefault="unqualified" elementFormDefault="unqualified" targetNamespace="http://v1_0.ws.auth.order.example.com/" xmlns:tns="http://v1_0.ws.auth.order.example.com/" xmlns:xs="http://www.w3.org/2001/XMLSchema">
4
+ <xs:element name="authenticate" type="tns:authenticate" />
5
+ <xs:element name="authenticateResponse" type="tns:authenticateResponse" />
6
+ <xs:element name="authenticationResult" type="tns:authenticationResult" />
7
+ <xs:element name="authenticationValue" type="tns:authenticationValue" />
8
+ <xs:complexType name="authenticate">
9
+ <xs:sequence>
10
+ <xs:element minOccurs="0" name="user" type="xs:string" />
11
+ <xs:element minOccurs="0" name="password" type="xs:string" />
12
+ </xs:sequence>
13
+ </xs:complexType>
14
+ <xs:complexType name="authenticateResponse">
15
+ <xs:sequence>
16
+ <xs:element minOccurs="0" name="return" type="tns:authenticationResult" />
17
+ </xs:sequence>
18
+ </xs:complexType>
19
+ <xs:complexType name="authenticationResult">
20
+ <xs:sequence>
21
+ <xs:element minOccurs="0" name="authenticationValue" nillable="true" type="tns:authenticationValue" />
22
+ <xs:element name="success" type="xs:boolean" />
23
+ </xs:sequence>
24
+ </xs:complexType>
25
+ <xs:complexType name="authenticationValue">
26
+ <xs:sequence>
27
+ <xs:element name="token" type="xs:string" />
28
+ <xs:element name="tokenHash" type="xs:string" />
29
+ <xs:element name="client" type="xs:string" />
30
+ </xs:sequence>
31
+ </xs:complexType>
32
+ </xs:schema>
33
+ </wsdl:types>
34
+ <wsdl:message name="authenticate">
35
+ <wsdl:part element="tns:authenticate" name="parameters" />
36
+ </wsdl:message>
37
+ <wsdl:message name="authenticateResponse">
38
+ <wsdl:part element="tns:authenticateResponse" name="parameters" />
39
+ </wsdl:message>
40
+ <wsdl:portType name="AuthenticationWebService">
41
+ <wsdl:operation name="authenticate">
42
+ <wsdl:input message="tns:authenticate" name="authenticate" />
43
+ <wsdl:output message="tns:authenticateResponse" name="authenticateResponse" />
44
+ </wsdl:operation>
45
+ </wsdl:portType>
46
+ <wsdl:binding name="AuthenticationWebServiceImplServiceSoapBinding" type="tns:AuthenticationWebService">
47
+ <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" />
48
+ <wsdl:operation name="authenticate">
49
+ <soap:operation soapAction="" style="document" />
50
+ <wsdl:input name="authenticate">
51
+ <soap:body use="literal" />
52
+ </wsdl:input>
53
+ <wsdl:output name="authenticateResponse">
54
+ <soap:body use="literal" />
55
+ </wsdl:output>
56
+ </wsdl:operation>
57
+ </wsdl:binding>
58
+ <wsdl:service name="AuthenticationWebServiceImplService">
59
+ <wsdl:port binding="tns:AuthenticationWebServiceImplServiceSoapBinding" name="AuthenticationWebServiceImplPort">
60
+ <soap:address location="http://example.com/validation/1.0/AuthenticationService" />
61
+ </wsdl:port>
62
+ </wsdl:service>
63
+ </wsdl:definitions>
@@ -0,0 +1,307 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:tns="http://api.example.com/api/" xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" targetNamespace="http://api.example.com/api/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
3
+ <wsdl:types>
4
+ <s:schema elementFormDefault="qualified" targetNamespace="http://api.example.com/api/">
5
+ <s:element name="User.GetApiKey">
6
+ <s:complexType>
7
+ <s:sequence>
8
+ <s:element minOccurs="0" maxOccurs="1" name="SiteUrl" type="s:string"/>
9
+ <s:element minOccurs="0" maxOccurs="1" name="Username" type="s:string"/>
10
+ <s:element minOccurs="0" maxOccurs="1" name="Password" type="s:string"/>
11
+ </s:sequence>
12
+ </s:complexType>
13
+ </s:element>
14
+ <s:element name="User.GetApiKeyResponse">
15
+ <s:complexType>
16
+ <s:sequence>
17
+ <s:element minOccurs="0" maxOccurs="1" name="User.GetApiKeyResult"/>
18
+ </s:sequence>
19
+ </s:complexType>
20
+ </s:element>
21
+ <s:complexType name="Result">
22
+ <s:sequence>
23
+ <s:element minOccurs="1" maxOccurs="1" name="Code" type="s:int"/>
24
+ <s:element minOccurs="0" maxOccurs="1" name="Message" type="s:string"/>
25
+ </s:sequence>
26
+ </s:complexType>
27
+ <s:complexType name="Client">
28
+ <s:sequence>
29
+ <s:element minOccurs="0" maxOccurs="1" name="ClientID" type="s:string"/>
30
+ <s:element minOccurs="0" maxOccurs="1" name="Name" type="s:string"/>
31
+ </s:sequence>
32
+ </s:complexType>
33
+ <s:complexType name="ArrayOfClient">
34
+ <s:sequence>
35
+ <s:element minOccurs="0" maxOccurs="unbounded" name="Client" nillable="true" type="tns:Client"/>
36
+ </s:sequence>
37
+ </s:complexType>
38
+ <s:element name="Client.Delete">
39
+ <s:complexType>
40
+ <s:sequence>
41
+ <s:element minOccurs="0" maxOccurs="1" name="ApiKey" type="s:string"/>
42
+ <s:element minOccurs="0" maxOccurs="1" name="ClientID" type="s:string"/>
43
+ </s:sequence>
44
+ </s:complexType>
45
+ </s:element>
46
+ <s:element name="Client.DeleteResponse">
47
+ <s:complexType>
48
+ <s:sequence>
49
+ <s:element minOccurs="0" maxOccurs="1" name="Client.DeleteResult" type="tns:Result"/>
50
+ </s:sequence>
51
+ </s:complexType>
52
+ </s:element>
53
+ <s:element name="User.GetClients">
54
+ <s:complexType>
55
+ <s:sequence>
56
+ <s:element minOccurs="0" maxOccurs="1" name="ApiKey" type="s:string"/>
57
+ </s:sequence>
58
+ </s:complexType>
59
+ </s:element>
60
+ <s:element name="User.GetClientsResponse">
61
+ <s:complexType>
62
+ <s:sequence>
63
+ <s:element minOccurs="0" maxOccurs="1" name="User.GetClientsResult"/>
64
+ </s:sequence>
65
+ </s:complexType>
66
+ </s:element>
67
+ <s:element name="anyType" nillable="true"/>
68
+ <s:element name="Result" nillable="true" type="tns:Result"/>
69
+ </s:schema>
70
+ </wsdl:types>
71
+ <wsdl:message name="User.GetApiKeySoapIn">
72
+ <wsdl:part name="parameters" element="tns:User.GetApiKey"/>
73
+ </wsdl:message>
74
+ <wsdl:message name="User.GetApiKeySoapOut">
75
+ <wsdl:part name="parameters" element="tns:User.GetApiKeyResponse"/>
76
+ </wsdl:message>
77
+ <wsdl:message name="Client.DeleteSoapIn">
78
+ <wsdl:part name="parameters" element="tns:Client.Delete"/>
79
+ </wsdl:message>
80
+ <wsdl:message name="Client.DeleteSoapOut">
81
+ <wsdl:part name="parameters" element="tns:Client.DeleteResponse"/>
82
+ </wsdl:message>
83
+ <wsdl:message name="User.GetClientsSoapIn">
84
+ <wsdl:part name="parameters" element="tns:User.GetClients"/>
85
+ </wsdl:message>
86
+ <wsdl:message name="User.GetClientsSoapOut">
87
+ <wsdl:part name="parameters" element="tns:User.GetClientsResponse"/>
88
+ </wsdl:message>
89
+ <wsdl:message name="User.GetApiKeyHttpGetIn">
90
+ <wsdl:part name="SiteUrl" type="s:string"/>
91
+ <wsdl:part name="Username" type="s:string"/>
92
+ <wsdl:part name="Password" type="s:string"/>
93
+ </wsdl:message>
94
+ <wsdl:message name="User.GetApiKeyHttpGetOut">
95
+ <wsdl:part name="Body" element="tns:anyType"/>
96
+ </wsdl:message>
97
+ <wsdl:message name="Client.DeleteHttpGetIn">
98
+ <wsdl:part name="ApiKey" type="s:string"/>
99
+ <wsdl:part name="ClientID" type="s:string"/>
100
+ </wsdl:message>
101
+ <wsdl:message name="Client.DeleteHttpGetOut">
102
+ <wsdl:part name="Body" element="tns:Result"/>
103
+ </wsdl:message>
104
+ <wsdl:message name="User.GetClientsHttpGetIn">
105
+ <wsdl:part name="ApiKey" type="s:string"/>
106
+ </wsdl:message>
107
+ <wsdl:message name="User.GetClientsHttpGetOut">
108
+ <wsdl:part name="Body" element="tns:anyType"/>
109
+ </wsdl:message>
110
+ <wsdl:message name="User.GetApiKeyHttpPostIn">
111
+ <wsdl:part name="SiteUrl" type="s:string"/>
112
+ <wsdl:part name="Username" type="s:string"/>
113
+ <wsdl:part name="Password" type="s:string"/>
114
+ </wsdl:message>
115
+ <wsdl:message name="User.GetApiKeyHttpPostOut">
116
+ <wsdl:part name="Body" element="tns:anyType"/>
117
+ </wsdl:message>
118
+ <wsdl:message name="Client.DeleteHttpPostIn">
119
+ <wsdl:part name="ApiKey" type="s:string"/>
120
+ <wsdl:part name="ClientID" type="s:string"/>
121
+ </wsdl:message>
122
+ <wsdl:message name="Client.DeleteHttpPostOut">
123
+ <wsdl:part name="Body" element="tns:Result"/>
124
+ </wsdl:message>
125
+ <wsdl:message name="User.GetClientsHttpPostIn">
126
+ <wsdl:part name="ApiKey" type="s:string"/>
127
+ </wsdl:message>
128
+ <wsdl:message name="User.GetClientsHttpPostOut">
129
+ <wsdl:part name="Body" element="tns:anyType"/>
130
+ </wsdl:message>
131
+ <wsdl:portType name="apiSoap">
132
+ <wsdl:operation name="GetApiKey">
133
+ <wsdl:input name="User.GetApiKey" message="tns:User.GetApiKeySoapIn"/>
134
+ <wsdl:output name="User.GetApiKey" message="tns:User.GetApiKeySoapOut"/>
135
+ </wsdl:operation>
136
+ <wsdl:operation name="DeleteClient">
137
+ <wsdl:input name="Client.Delete" message="tns:Client.DeleteSoapIn"/>
138
+ <wsdl:output name="Client.Delete" message="tns:Client.DeleteSoapOut"/>
139
+ </wsdl:operation>
140
+ <wsdl:operation name="GetClients">
141
+ <wsdl:input name="User.GetClients" message="tns:User.GetClientsSoapIn"/>
142
+ <wsdl:output name="User.GetClients" message="tns:User.GetClientsSoapOut"/>
143
+ </wsdl:operation>
144
+ </wsdl:portType>
145
+ <wsdl:portType name="apiHttpGet">
146
+ <wsdl:operation name="GetApiKey">
147
+ <wsdl:input name="User.GetApiKey" message="tns:User.GetApiKeyHttpGetIn"/>
148
+ <wsdl:output name="User.GetApiKey" message="tns:User.GetApiKeyHttpGetOut"/>
149
+ </wsdl:operation>
150
+ <wsdl:operation name="DeleteClient">
151
+ <wsdl:input name="Client.Delete" message="tns:Client.DeleteHttpGetIn"/>
152
+ <wsdl:output name="Client.Delete" message="tns:Client.DeleteHttpGetOut"/>
153
+ </wsdl:operation>
154
+ <wsdl:operation name="GetClients">
155
+ <wsdl:input name="User.GetClients" message="tns:User.GetClientsHttpGetIn"/>
156
+ <wsdl:output name="User.GetClients" message="tns:User.GetClientsHttpGetOut"/>
157
+ </wsdl:operation>
158
+ </wsdl:portType>
159
+ <wsdl:portType name="apiHttpPost">
160
+ <wsdl:operation name="GetApiKey">
161
+ <wsdl:input name="User.GetApiKey" message="tns:User.GetApiKeyHttpPostIn"/>
162
+ <wsdl:output name="User.GetApiKey" message="tns:User.GetApiKeyHttpPostOut"/>
163
+ </wsdl:operation>
164
+ <wsdl:operation name="DeleteClient">
165
+ <wsdl:input name="Client.Delete" message="tns:Client.DeleteHttpPostIn"/>
166
+ <wsdl:output name="Client.Delete" message="tns:Client.DeleteHttpPostOut"/>
167
+ </wsdl:operation>
168
+ <wsdl:operation name="GetClients">
169
+ <wsdl:input name="User.GetClients" message="tns:User.GetClientsHttpPostIn"/>
170
+ <wsdl:output name="User.GetClients" message="tns:User.GetClientsHttpPostOut"/>
171
+ </wsdl:operation>
172
+ </wsdl:portType>
173
+ <wsdl:binding name="apiSoap" type="tns:apiSoap">
174
+ <soap:binding transport="http://schemas.xmlsoap.org/soap/http"/>
175
+ <wsdl:operation name="GetApiKey">
176
+ <soap:operation soapAction="http://api.example.com/api/User.GetApiKey" style="document"/>
177
+ <wsdl:input name="User.GetApiKey">
178
+ <soap:body use="literal"/>
179
+ </wsdl:input>
180
+ <wsdl:output name="User.GetApiKey">
181
+ <soap:body use="literal"/>
182
+ </wsdl:output>
183
+ </wsdl:operation>
184
+ <wsdl:operation name="DeleteClient">
185
+ <soap:operation soapAction="http://api.example.com/api/Client.Delete" style="document"/>
186
+ <wsdl:input name="Client.Delete">
187
+ <soap:body use="literal"/>
188
+ </wsdl:input>
189
+ <wsdl:output name="Client.Delete">
190
+ <soap:body use="literal"/>
191
+ </wsdl:output>
192
+ </wsdl:operation>
193
+ <wsdl:operation name="GetClients">
194
+ <soap:operation soapAction="http://api.example.com/api/User.GetClients" style="document"/>
195
+ <wsdl:input name="User.GetClients">
196
+ <soap:body use="literal"/>
197
+ </wsdl:input>
198
+ <wsdl:output name="User.GetClients">
199
+ <soap:body use="literal"/>
200
+ </wsdl:output>
201
+ </wsdl:operation>
202
+ </wsdl:binding>
203
+ <wsdl:binding name="apiSoap12" type="tns:apiSoap">
204
+ <soap12:binding transport="http://schemas.xmlsoap.org/soap/http"/>
205
+ <wsdl:operation name="GetApiKey">
206
+ <soap12:operation soapAction="http://api.example.com/api/User.GetApiKey" style="document"/>
207
+ <wsdl:input name="User.GetApiKey">
208
+ <soap12:body use="literal"/>
209
+ </wsdl:input>
210
+ <wsdl:output name="User.GetApiKey">
211
+ <soap12:body use="literal"/>
212
+ </wsdl:output>
213
+ </wsdl:operation>
214
+ <wsdl:operation name="DeleteClient">
215
+ <soap12:operation soapAction="http://api.example.com/api/Client.Delete" style="document"/>
216
+ <wsdl:input name="Client.Delete">
217
+ <soap12:body use="literal"/>
218
+ </wsdl:input>
219
+ <wsdl:output name="Client.Delete">
220
+ <soap12:body use="literal"/>
221
+ </wsdl:output>
222
+ </wsdl:operation>
223
+ <wsdl:operation name="GetClients">
224
+ <soap12:operation soapAction="http://api.example.com/api/User.GetClients" style="document"/>
225
+ <wsdl:input name="User.GetClients">
226
+ <soap12:body use="literal"/>
227
+ </wsdl:input>
228
+ <wsdl:output name="User.GetClients">
229
+ <soap12:body use="literal"/>
230
+ </wsdl:output>
231
+ </wsdl:operation>
232
+ </wsdl:binding>
233
+ <wsdl:binding name="apiHttpGet" type="tns:apiHttpGet">
234
+ <http:binding verb="GET"/>
235
+ <wsdl:operation name="GetApiKey">
236
+ <http:operation location="/User.GetApiKey"/>
237
+ <wsdl:input name="User.GetApiKey">
238
+ <http:urlEncoded/>
239
+ </wsdl:input>
240
+ <wsdl:output name="User.GetApiKey">
241
+ <mime:mimeXml part="Body"/>
242
+ </wsdl:output>
243
+ </wsdl:operation>
244
+ <wsdl:operation name="DeleteClient">
245
+ <http:operation location="/Client.Delete"/>
246
+ <wsdl:input name="Client.Delete">
247
+ <http:urlEncoded/>
248
+ </wsdl:input>
249
+ <wsdl:output name="Client.Delete">
250
+ <mime:mimeXml part="Body"/>
251
+ </wsdl:output>
252
+ </wsdl:operation>
253
+ <wsdl:operation name="GetClients">
254
+ <http:operation location="/User.GetClients"/>
255
+ <wsdl:input name="User.GetClients">
256
+ <http:urlEncoded/>
257
+ </wsdl:input>
258
+ <wsdl:output name="User.GetClients">
259
+ <mime:mimeXml part="Body"/>
260
+ </wsdl:output>
261
+ </wsdl:operation>
262
+ </wsdl:binding>
263
+ <wsdl:binding name="apiHttpPost" type="tns:apiHttpPost">
264
+ <http:binding verb="POST"/>
265
+ <wsdl:operation name="GetApiKey">
266
+ <http:operation location="/User.GetApiKey"/>
267
+ <wsdl:input name="User.GetApiKey">
268
+ <mime:content type="application/x-www-form-urlencoded"/>
269
+ </wsdl:input>
270
+ <wsdl:output name="User.GetApiKey">
271
+ <mime:mimeXml part="Body"/>
272
+ </wsdl:output>
273
+ </wsdl:operation>
274
+ <wsdl:operation name="DeleteClient">
275
+ <http:operation location="/Client.Delete"/>
276
+ <wsdl:input name="Client.Delete">
277
+ <mime:content type="application/x-www-form-urlencoded"/>
278
+ </wsdl:input>
279
+ <wsdl:output name="Client.Delete">
280
+ <mime:mimeXml part="Body"/>
281
+ </wsdl:output>
282
+ </wsdl:operation>
283
+ <wsdl:operation name="GetClients">
284
+ <http:operation location="/User.GetClients"/>
285
+ <wsdl:input name="User.GetClients">
286
+ <mime:content type="application/x-www-form-urlencoded"/>
287
+ </wsdl:input>
288
+ <wsdl:output name="User.GetClients">
289
+ <mime:mimeXml part="Body"/>
290
+ </wsdl:output>
291
+ </wsdl:operation>
292
+ </wsdl:binding>
293
+ <wsdl:service name="api">
294
+ <wsdl:port name="apiSoap" binding="tns:apiSoap">
295
+ <soap:address location="https://api.example.com/api/api.asmx"/>
296
+ </wsdl:port>
297
+ <wsdl:port name="apiSoap12" binding="tns:apiSoap12">
298
+ <soap12:address location="https://api.example.com/api/api.asmx"/>
299
+ </wsdl:port>
300
+ <wsdl:port name="apiHttpGet" binding="tns:apiHttpGet">
301
+ <http:address location="https://api.example.com/api/api.asmx"/>
302
+ </wsdl:port>
303
+ <wsdl:port name="apiHttpPost" binding="tns:apiHttpPost">
304
+ <http:address location="https://api.example.com/api/api.asmx"/>
305
+ </wsdl:port>
306
+ </wsdl:service>
307
+ </wsdl:definitions>