Skip to content

SOAP and WSDL

WSDL 1.1 is a first-class input, not a translation layer over the REST path.

What is ingested

Namespaces, XSD types, SOAP headers, faults and bindings are preserved. XSD is translated to JSON Schema for tool inputs: primitives, facets such as minLength, pattern and enumeration, minOccurs and maxOccurs, and named type references resolved through an index built over every schema in the document.

Document/literal and rpc/literal bindings are both ingested. They differ in how the body is shaped, not in what the parameters are, so the tool schema is derivable either way.

What is refused, and why

Section 5 encoding serialises values as a reference graph, which this compiler does not write. An encoded operation is blocked rather than approximated.

Constructs with no faithful JSON Schema translation, such as substitution groups, mixed content and xsi:type polymorphism, are recorded as ambiguities rather than approximated. Inventing an approximation of a type system is how a generated client corrupts data.

WSDL imports are recorded rather than resolved. WS-Security and MTOM are recorded as ambiguities.

Side effects must be recorded by a human

WSDL carries no signal equivalent to an HTTP method. An operation named DeleteCustomer might delete, and might return a receipt.

So SOAP operations are never classified by inference. Every one arrives unclassified, and the emission gate blocks it until a reviewer records the side effect in the overlay. This was once a dead end, where the compiler required a classification and offered no way to express one; the overlay now carries it as a human decision naming the operation it applies to.

What the generated server does

serve emits a server that posts a SOAP 1.1 envelope to the service endpoint, in document or rpc shape as the binding declares, carrying the SOAPAction and target namespace the specification named. Arguments are XML-escaped. Faults are reported as faults rather than as transport errors. Policy travels with the tool exactly as it does over HTTP.

Verified against real services

Two public document/literal services were fetched, classified by a reviewer, compiled and served, and the generated server made real calls. Two defects appeared that no fixture would have caught:

  • A document body carries the element the message part references, not the part's own name. Using the part name produced a fault from every real service while every local fixture passed.
  • Redaction removed a service's answer because a field name contained token, where it was a delimiter rather than a credential. See policy.

Coverage was also measured against forty third-party WSDL documents from a public test collection, fetched and never redistributed.