XML - статьи

Указание вложений


Рассмотренные примеры позволяют Web-сервису описывать вложения, но это описание ничего не говорит о том, как указывать вложения из конверта SOAP (SOAP Envelope), а это самый обычный случай использования. Рассмотрим ситуацию, когда бинарные данные слишком велики, чтобы их встраивать в конверт SOAP. SwA позволяет передавать данные в качестве вложения, но их необходимо указывать из конверта SOAP. Благодаря такому подходу для более высоких уровней приложения неважно, встроены данные или отправлены как вложение. (Например, на Java для этого можно было бы воспользоваться javax.activation.DataHandler).

Basic Profile 1.1 решает проблему описания отношения указатель-указание, определяя тип swaRef во (временном) пространстве имен http://ws-i.org/profiles/basic/1.1/xsd (этот тип образован путем ограничения типа xsd:anyURI):

<xsd:schema targetNamespace="http://ws-i.org/profiles/basic/1.1/xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xsd:simpleType name="swaRef"> <xsd:restriction base="xs:anyURI" /> </xsd:simpleType> </xsd:schema>

Basic Profile 1.1 требует, чтобы значение этого типа было разрешено в пакете MIME, то есть URI, который является значением этого типа в реальном документе, должен разыменовывать часть MIME в том же самом пакете MIME.

Благодаря этому отношения между указателем и указанием становится доступным для инструментов, которые смогут сгенерировать артефакты кода с богатой семантикой (например, сгенерировать ориентированные на поток интерфейсы для доступа к вложенным данным). Приложения могут использовать другие механизмы для выражения подобных отношений указатель-указание. Тип swaRef предоставляет унифицированный механизм идентификации указаний, которые ссылаются на вложения, и, следовательно, способствует обеспечению совместимости.

В рассмотренном выше примере со стилем rpc/literal тип части photo-reference входного сообщения может быть изменен на swaRef. Аналогично, для примера с document/literal тип элемента photo-reference в разделе wsdl:types также может быть изменен на swaRef. Из-за того, что элемент photo-reference в конверте SOAP (SOAP Envelope) указывает на часть MIME в том же самом пакете MIME, можно снова говорить о факте доступности в этом описании WSDL. Пример rpc/literal может быть модифицирован для использования этого нового типа следующим образом (заметим, что префикс bp11 пространства имен привязан к URI для пространства имен http://ws-i.org/profiles/basic/1.1/xsd):

<wsdl:message name="msg-in"> <wsdl:part name="photo-reference" type="bp11:swaRef"/> <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>

Теперь процессор WSDL, обрабатывающий этот фрагмент кода WSDL, знает, что URI в теле SOAP (SOAP Body) является указанием на часть MIME в том же самом пакете MIME, и может генерировать соответствующие интерфейсы прикладного программирования для доступа к бинарным данным, которые отправляются как отдельная часть MIME. Ранее, когда тип swaRef еще не использовался, процессор WSDL не знал, разрешится ли значение URI в сообщении SOAP локально и разрешится ли вообще.


Содержание раздела