double arrow

Листинг 16.1


POST /MyService HTTP/1.1

Host: www.servicesite.com

Content-Type:text/xml; charset="utf-8"

Contant-Length: xxxx

SOAPAction: "www.servicesite.com/action"

<SOAP-ENV:Envelope

xmlns:SQAP-ENV="http://schemas.xmlsoap.org/soap/envelope"

SQAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding">

<SOAP-ENV:Body>

<m:GetSomeValue xmlns:m=" www.servicesite.com/action ">

< symbo1>SYM</symbo1>

< /m: GetSomeVa1ue >

</SQAP-ENV:Body>

</Soap-ENV:Envelope>

Естественно, первые пять строк относятся не к самому SOAP-запросу, а к протоколу HTTP, по которому он доставляется. Шестая строка объявляет конверт SOAP-запроса. В данном примере показан запрос без заголовка, так как в седьмой строке объявляется тело SOAP-запроса, внутри которого располагаются некоторые данные.

Теперь, когда мы увидели пример стандартного SOAP-запроса, можно поговорить об основных правилах составления и обработки SOAP-сообщений. Прежде всего, приложение, которое получает SOAP-сообщение, должно выделить все его элементы, предназначенные именно для этого приложения. После выделения подобных компонентов, приложение обрабатывает их согласно заложенной в него логике. Если SOAP-сообщение не содержит некоторых обязательных частей, оно может (но не обязано) быть приложением отвергнуто. Однако в том случае, если отсутствие этих частей не является для приложения критичным, оно может продолжить обработку SOAP-запроса. Если SOAP-сообщение предназначено не только для этого конкретного обрабатывающего приложения, то перед отправкой его следующему получателю, приложение должно удалить из сообщения все элементы, относящиеся только к обрабатывающему приложению. Таким образом, переходя по цепочке обрабатывающих приложений, SOAP-сообщение может "худеть".

Что касается самого SOAP-сообщения, то оно, как мы уже знаем, обязано быть составлено согласно правилам синтаксиса XML. Для всех элементов сообщения и их стандартных атрибутов должны использоваться соответствующие префиксы, указанные в пространствах имен. При этом явные ссылки в теле SOAP-сообщения на используемые пространства имен не являются обязательными. В случае их отсутствия, обрабатывающее приложение считает, что указаны два стандартных пространства имен. Но если в теле SOAP-сообщения находится неверная ссылка на стандартное пространство имен или указано какое-либо дополнительное пространство имен, приложение должно отказаться от обработки SOAP-сообщения. Подобное ограничение действует на уровне конвертов SOAP-сообщений.

Как было сказано, в SOAP используются два стандартных пространства имен. Все содержимое SOAP-конверта использует пространство имен, рас­полагающееся по адресу http://shemas.xmlsoap.org/soap/envelope. а приме­няемые кодировки определены в пространстве имен, находящемся по адресу http://schemas.xmlsoap.org/soap/encoding. В нашем первом примере мы видели на них ссылки.

Так как все возможные элементы сообщений SOAP заранее определены, то нет нужды использовать DTD-блоки. Более того, если в сообщении SOAP будет находиться DTD-блок или даже ссылка на него, оно будет считаться некорректным.

Теперь попробуем определить соотношения между тремя основными блоками SOAP-сообщения. Начнем с более или менее формального описания конверта.

Конверт определяется при помощи элемента Envelope. Это обязательный компонент сообщений SOAP. В нем могут (но не обязаны) быть размещены ссылки на используемые пространства имен. Если приложение или разработчик размещают в конверте дополнительные элементы, они должны быть описаны в одном из стандартных пространств имен.

Заголовок сообщения SOAP объявляется при помощи элемента Header. Данный компонент не является обязательным. Он используется в тех случаях, когда необходимо расширить стандартную функциональность SOAP- сообщения. В заголовке находятся элементы, которые подскажут приложению, обрабатывающему SOAP-запрос, какие именно функции будут реализованы при помощи данного SOAP-сообщения. Заголовок SOAP-сообщения является прямым потомком конверта, то есть на уровне тегов он просто вкладывается в теги с наименованием Envelope.

Тело SOAP-сообщения объявляется при помощи элемента Body. Этот компонент является обязательным. Так же, как и заготовок, он является пря­мым потомком конверта. Естественно, как тело, так и заголовок могут су­ществовать в сообщении SOAP только в единственном экземпляре. Если у сообщения есть заголовок, тело сообщения должно объявляться сразу после заголовка. То есть открывающий тег тела сообщения должен вплотную при­мыкать к закрывающему тегу заголовка сообщения.

Во всех компонентах SOAP-сообщения, на любом уровне вложенности тегов может использоваться атрибут encodingStyle, который сообщает. какой набор правил должен применяться для представления данных компонента. Чаше всего при помощи этого атрибута указывают используемую кодировку символов. В качестве значений атрибута используются элементы уже упоминавшегося пространства имен http://schemas.xmlsoap.org/soap/encoding. Если для какого-либо компонента SOAP-сообщения не указан явным образом данный атрибут, то используются атрибуты родительских компонентов. Проше говоря, если разработчик или приложение задали в заголовке правила отображения, то они будут распространены на все приложение за исключением тех его элементов. в которых явным образом установлено другое значение данного атрибута.

Теперь перейдем к более детальному рассмотрению правил создания заголовка и тела SOAP-сообщений.


Сейчас читают про: