Описание вложений
Как указано в уставе Рабочей группы Basic Profile, добавление в разрабатываемый стандарт положения о поддержке вложений предусматривает обратную совместимость. Это означает, что все артефакты Basic Profile 1.0 (DESCRIPTION, MESSAGE, INSTANCE и т.д.) будут также совместимы и с Basic Profile 1.1. Для этого в Basic Profile 1.0 были удалены и изменены требования, согласно которым соединение (binding) ограничивается только SOAP HTTP, то есть теперь стало допустимым соединение SOAP HTTP, либо соединение MIME.
Хотя SwA довольно надежная спецификация, Раздел 5 "MIME Binding" Примечания WSDL 1.1 не совсем точно определен, что ведет к проблемам с совместимостью. Basic Profile 1.1 связывает этот раздел с SwA. Соединения MIME трактуются как нечто отличное от SwA. В Basic Profile 1.1 также исправлены двусмысленности соединений MIME, а также ошибки ("баги") в схеме соединений MIME.
Приведенный ниже фрагмент кода WSDL 1.1 демонстрирует, что можно делать с помощью Basic Profile 1.1 для стиля rpc/literal (заметим, что префиксы пространства имен привязаны к тем же самым универсальным идентификаторам ресурса, как и в Разделе 1.2 :
<wsdl:message name="msg-in"> <wsdl:part name="photo-reference" type="xsd:anyURI"/> <wsdl:part name="photo-attachment" type="xsd:base64Binary"/> </wsdl:message>
<wsdl:message name="msg-out"> <wsdl:part name="result" type="xsd:string"/> </wsdl:message>
<wsdl:portType name="my-portType"> <wsdl:operation name="my-operation"> <wsdl:input message="tns:msg-in"/> <wsdl:output message="tns:msg-out"/> </wsdl:operation> </wsdl:portType>
<wsdl:binding name="my-binding" type="tns:my-portType"> <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/> <wsdl:operation name="my-operation"> <soap:operation soapAction="http://example.com/soapaction"/> <wsdl:input> <mime:multipartRelated> <mime:part> <soap:body parts="photo-reference" use="literal" namespace="http://example.com/some-namespace"/> </mime:part> <mime:part> <mime:content part="photo-attachment" type="application/octetstream"/> </mime:part> </mime:multipartRelated> </wsdl:input> <wsdl:output> <soap:body use="literal" namespace="http://example.com/some-namespace"/> </wsdl:output> </wsdl:operation> </wsdl:binding>
В этом фрагменте часть (part) photo-reference входного сообщения привязана к телу SOAP (SOAP Body), а часть (part) photo-attachment - к отдельной части (part) MIME. Ниже приведен пример входного сообщения для соединения my-binding:
MIME-Version: 1.0 Content-Type: Multipart/Related; boundary=boundary; type=text/xml; start="<my-root-part@example.com>" Content-Description: This is an optional message description.
--boundary Content-Type: text/xml; charset="UTF-8" Content-Transfer-Encoding: 8bit Content-ID: <my-root-part@example.com>
<?xml version='1.0' ?> <env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"> <env:Body xmlns:types="http://example.com/some-namespace"> <types:my-operation> <photo-reference>cid:my-cool-photo@example.com</photo-reference> </types:my-operation> </env:Body> </env:Envelope>
--boundary Content-Type: application/octet-stream Content-Transfer-Encoding: binary Content-ID: <my-cool-photo@example.com>
...binary photograph... --boundary--
Заметим, что входное сообщение привязано к соединению MIME, а выходное - к соединению SOAP HTTP по Basic Profile 1.0. Basic Profile 1.1 допускает подобное смешение. На самом деле Basic Profile 1.1 "идет дальше" - если используемое соединение MIME, а тело SOAP (SOAP Body) - единственная перечисленная часть MIME, отправитель может отправить это сообщение, применяя соединение SOAP HTTP (если нет вложений) или соединение MIME.
Ниже приведен эквивалентный пример с такими же входным и выходным сообщениями. В этом фрагменте используется стиль document/literal вместо rpc/literal (заметим, что префикс types пространства имен привязан к URI (Uniform Resource Identifier, Универсальный идентификатор ресурса) для пространства имен http://example.com/some-namespace):
<wsdl:types> <schema targetNamespace="http://example.com/some-namespace" xmlns="http://www.w3.org/2000/10/XMLSchema" elementFormDefault="unqualified"> <element name="my-operation"> <complexType> <sequence> <element name="photo-reference" type="xsd:anyURI"/> </sequence> </complexType> </element> <element name="my-operationResponse"> <complexType> <sequence> <element name="result" type="xsd:string"/> <sequence> </complexType> </element> </schema> </wsdl:types>
<wsdl:message name="msg-in-doc"> <wsdl:part name="photo-reference-wrapper" element="types:my-operation"/> <wsdl:part name="photo-attachment" type="xsd:base64Binary"/> </wsdl:message> <wsdl:message name="msg-out-doc"> <wsdl:part name="result-wrapper" element="types:my-operationResponse"/> </wsdl:message>
<wsdl:portType name="my-portType-doc"> <wsdl:operation name="my-operation-doc"> <wsdl:input message="tns:msg-in-doc"/> <wsdl:output message="tns:msg-out-doc"/> </wsdl:operation> </wsdl:portType>
<wsdl:binding name="my-binding-doc" type="tns:my-portType-doc"> <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> <wsdl:operation name="my-operation-doc"> <soap:operation soapAction="http://example.com/soapaction"/> <wsdl:input> <mime:multipartRelated> <mime:part> <soap:body parts="photo-reference-wrapper" use="literal"/> </mime:part> <mime:part> <mime:content part="photo-attachment" type="application/octetstream"/> </mime:part> </mime:multipartRelated> </wsdl:input> <wsdl:output> <soap:body use="literal" /> </wsdl:output> </wsdl:operation> </wsdl:binding>