Как мы уже знаем, заголовок является необязательной частью SOAP- сообщения. Однако эта часть сообщения позволяет несколько расширять стандартную функциональность SOAP. Необходимо помнить, что любой элемент заголовка должен быть описан со ссылкой на пространство имен, в котором данный элемент объявляется. Так, если мы хотим использовать в заголовке некий элемент, в котором мы бы передавали, скажем, номер транзакции, то заголовок может выглядеть следующим образом:
<SOAP-ENV:Header>
<trans:Transaction
xmlns:trans="http://www.myhost.com/namespaces/myspace/"
SOAP-ENV:mustunderstand="1">
</trans:Transaction>
</SOAP-ENV:Header>
В этом маленьком примере мы объявили элемент заголовка с наименованием Transaction. При этом пространство имен, в котором описан данный элемент, находится по адресу httр://www.myhost.com/namespaces/myspacе/. Значение элемента Transaction в данном случае равно двенадцати. Также данный элемент обладает атрибутом mustunderstand с единичным значением. Об этом атрибуте следует поговорить несколько подробнее.
Когда отправитель SОАР-сообщения его передает, он предполагает, что получатель сообщения будет иметь некоторое представление о структуре сообщения. Так, если функционирует связка из двух приложений, разработанных специально друг для друга, то разработчик, естественно, заложит в них обработку неких элементов заголовка. При этом и получатель, и отправитель знают наименования элементов заголовка, и. соответственно, будут их искать и создавать. Так вот, для тех элементов заголовка, которые получатель должен понимать, устанавливается атрибут mustunderstand с приписанным ему, как в нашем примере, единичным значением.
Подобный атрибут может принимать всего два значения — единичное и нулевое. Атрибут mustunderstand с нулевым значением эквивалентен отсутствию этого атрибута.
Если обрабатывающее приложение не в состоянии правильно распознать элемент заголовка с атрибутом mustunderstand, оно обязано вернуть SOAP- сообщение с указанием кода возникшей ошибки. Точно так же ему следует поступить, если значение этого атрибута будет отличаться от нуля или единицы.
Помимо атрибута mustunderstand, у элементов заголовка SOAP-сообщения может быть атрибут actor. Как говорилось несколько ранее, одно и то же сообщение иногда попадает на обработку в несколько приложений. При этом оно передается между ними по цепочке, т. е. приложение, обработавшее сообщение, передает его следующему получателю. При этом в заголовке сообщения могут находиться элементы, предназначенные для разных приложений. И далеко не факт, что элементы, помеченные как mustunderstand, будут "понятны" каждому приложению в цепочке. Приложения потому и разные, что у каждого своя функциональность, и для каждого есть свой набор элементов, которые они обязаны "понимать". Поэтому необходимо каким-либо образом указывать, для какого именно приложения предназначен тот или иной элемент. Именно для этой цели и существует атрибут асtor.
Каждому приложению, обрабатывающему SOAP-сообщение, придается определенный уникальный идентификатор. И тогда в качестве значения атрибута actor некоего элемента используется идентификатор именно того приложения, которое должно обрабатывать данный элемент. Так как каждое приложение знает собственный идентификатор, выделение именно тех элементов заголовка, которые ему нужны, становится тривиальной задачей.
После того как приложение обработало свои элементы, перед пересылкой SOAP-сообщения следующему приложению из цепочки обработчиков, оно обязано удалить из него все элементы, которые были им обработаны. Таким образом, одновременно уменьшается размер пересылаемого пакета и облегчается его синтаксический анализ следующим приложением.
Следует также отметить, что в качестве значения данного атрибута можно использовать идентификатор http://schemas.xmlsoap.org/soap/actor/next, который указывает, что сообщение должно быть передано первому приложению из списка получателей. Если же атрибут actor вообще не применялся в объявлении элементов заголовка SOAP-сообщения, это означает, что у данного SOAP-сообщения есть только один получатель.
Теперь, после того, как мы рассмотрели правила, по которым составляется заголовок SOAP-сообщения, перейдем к рассмотрению структуры тела SOAP-сообщения.