WSDL Modeling¶
The implementation is experimental and currently only WSDL 1.1 and SOAP 1.1 bindings have been implemented.
In addition to models derived from XML schemas, the code generator also generates dataclasses for messages and simple classes to describe the unique operations.
Make sure you install both the CLI and SOAP requirements.
Message Model¶
The message models are no different from XSD-derived classes and include the complete
structure of the Envelope wrapper.
@dataclass(kw_only=True)
class Body:
add: Add = field(
metadata={
"name": "Add",
"type": "Element",
"namespace": "http://tempuri.org/",
}
)
@dataclass(kw_only=True)
class CalculatorSoapAddOutput:
class Meta:
name = "Envelope"
namespace = "http://schemas.xmlsoap.org/soap/envelope/"
body: CalculatorSoapAddOutput.Body = field(
metadata={
"name": "Body",
"type": "Element",
Operation Class¶
The [DefinitionsMapper][pyxsdata.codegen.mappers.DefinitionsMapper] will generate simple static classes to describe all the unique operations and the binding procedure.
transport = "http://schemas.xmlsoap.org/soap/http"
soap_action = "http://tempuri.org/Divide"
input = CalculatorSoapDivideInput
output = CalculatorSoapDivideOutput
class CalculatorSoapMultiply:
Client¶
The [Client][pyxsdata.formats.dataclass.client.Client] is a proxy for consuming web services. The client needs a web service [Config][pyxsdata.formats.dataclass.client.Config] with the directives to process requests and responses.
You can also optionally provide and override:
- A [Transport][pyxsdata.formats.dataclass.transports.Transport] implementation
- An [XmlParser][pyxsdata.formats.dataclass.parsers.XmlParser] instance
- An [XmlSerializer][pyxsdata.formats.dataclass.serializers.XmlSerializer] instance
Creating instances¶
The client can be initialized from the operation class directly:
>>> from pyxsdata.formats.dataclass.client import Client
>>> from tests.fixtures.calculator import CalculatorSoapAdd
>>> client = Client.from_service(CalculatorSoapAdd)
>>> client.config
Config(style='document', location='http://www.dneonline.com/calculator.asmx', transport='http://schemas.xmlsoap.org/soap/http', soap_action='http://tempuri.org/Add', input=<class 'tests.fixtures.calculator.services.CalculatorSoapAddInput'>, output=<class 'tests.fixtures.calculator.services.CalculatorSoapAddOutput'>, encoding=None)
You can also override any properties as needed:
>>> client = Client.from_service(CalculatorSoapAdd, location="http://testurl.com")
>>> client.config
Config(style='document', location='http://testurl.com', transport='http://schemas.xmlsoap.org/soap/http', soap_action='http://tempuri.org/Add', input=<class 'tests.fixtures.calculator.services.CalculatorSoapAddInput'>, output=<class 'tests.fixtures.calculator.services.CalculatorSoapAddOutput'>, encoding=None)
Or you can configure the client manually:
config = Config(
style="document",
location="",
transport=TransportTypes.SOAP,
soap_action="",
input=None,
output=None,
)
client = Client(config=config)
Override transport¶
Initialize the transport with a custom requests session instance:
from requests import Session
transport = DefaultTransport(session=Session())
client = Client(config=config, transport=transport)
Performing Requests¶
The send method requires either an object that matches the config input type or a dictionary with raw values that matches the input dataclass field names and structure.
request = CalculatorSoapAddInput(body=CalculatorSoapAddInput.Body(add=Add(10, 2)))
client.send(request)
# CalculatorSoapAddOutput(body=CalculatorSoapAddOutput.Body(add_response=AddResponse(add_result=12)))
client = Client.from_service(CalculatorSoapAdd)
params = {"body": {"add": {"int_a": 3, "int_b": 4}}}
client.send(params)
# CalculatorSoapAddOutput(body=CalculatorSoapAddOutput.Body(add_response=AddResponse(add_result=7)))
You can also provide a dictionary of custom headers, although headers required for the web service to function cannot be overwritten:
You need to specify an encoding if you intend to send non-ASCII characters: