ISoapClient calls an operation on a SOAP 1.1 service such as WCF. Operations are
described in config, not read from a WSDL: the SOAPAction defaults to
namespace + :contract + / + operation, and :operations overrides it, the
timeout and more per operation.
(ports/call! client :GetListEntries
[[:Sitename "town"]
[:filterRequest {:Sitename "town" :ListId list-id :SinceDate "2026-10-01T00:00:00"}]])
;; => {:success? true :result {:list-entries [...] :status "0"} :body {...}}
Element names are sent as written. A map is written in DataContract’s default
order, ordinal by name; pass [name value] pairs where the contract declares
another order. Nested members use :data-namespace. The response has kebab-case
keys and string values: xsi:nil is nil, WCF dictionaries are maps and arrays
vectors. Name an array that may hold one item in the operation’s :arrays, or it
reads as a map.
A SOAP fault returns {:success? false :error {:type :fault :code … :message …}};
no usable answer returns :type :external-error. Faults listed in :retry-faults
(a throttling message, say), refused connections and 429s are retried with
backoff; timeouts and 5xx are retried only for operations that are
:idempotent?, the default. Credentials go as HTTP Basic or, with
:credential-elements, as leading parameters, and are never logged.