Перейти к основному содержимому

Настройка заголовков исходящего SOAP-сообщения

SOAP-заголовки могут использоваться для передачи дополнительной информации, непосредственно не связанной с задачей, решаемой операцией сервиса. В частности, это может быть информация, используемая для проверки прав доступа к сервису. Для этого часто используется стандарт Web Service Security, который определяет набор стандартных SOAP-заголовков для аутентификации и шифрования. Например, SOAP-сервис магазина содержит операцию ДобавитьВКаталог для добавления товара (строка-наименование и число-количество) в каталог. Для этой операции в сервисе реализована проверка доступа через WSS-токен UsernameToken. Тогда для вызова операции клиенту требуется передать сервису SOAP-заголовок с именем пользователя и паролем. Упрощенный фрагмент WSDL-описания сервиса:

<definitions>
<types>
<schema>
<element name="ДобавитьВКаталог" type="tns:ДобавитьВКаталог"/>
<element name="ДобавитьВКаталогResponse" type="tns:ДобавитьВКаталогResponse"/>
<element name="Товар" type="tns:Товар"/>
<complexType name="ДобавитьВКаталог">
<sequence>
<element minOccurs="0" name="arg0" type="tns:Товар"/>
</sequence>
</complexType>
<complexType final="extension restriction" name="Товар">
<sequence>
<element name="Количество" type="int"/>
<element minOccurs="0" name="Наименование" type="string"/>
</sequence>
</complexType>
<complexType name="ДобавитьВКаталогResponse">
<sequence>
<element minOccurs="0" name="return" type="string"/>
</sequence>
</complexType>
</schema>
</types>
<message name="ДобавитьВКаталог">
<part element="tns:ДобавитьВКаталог" name="parameters"/>
</message>
<message name="ДобавитьВКаталогResponse">
<part element="tns:ДобавитьВКаталогResponse" name="parameters"/>
</message>
<portType name="СервисМагазина">
<operation name="ДобавитьВКаталог">
<input message="tns:ДобавитьВКаталог" wsam:Action="ДобавитьВКаталог"/>
<output message="tns:ДобавитьВКаталогResponse"/>
</operation>
</portType>
</definitions>

У клиента КлиентСервисаМагазина генерируется метод ДобавитьВКаталог. Для настройки SOAP-заголовка с именем пользователя и паролем в модуле клиента SOAP-сервиса следует добавить обработчик НастроитьЗаголовкиSoap<ИмяМетодаСервиса>. Обработчик будет вызван при выполнении метода ДобавитьВКаталог, он добавит в запрос SOAP-заголовок с именем пользователя и паролем:

const ПРОСТРАНСТВО_WSS = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"

@ВПроекте
структура ЗаголовокТокенПользователя
знч Пользователь: Строка
знч Пароль: Строка
;

@Обработчик
метод НастроитьЗаголовкиSoapДобавитьВКаталог(Парам: КлиентСервисаМагазина.Товар?, ЗаписьSoap: ЗаписьSoap_1_1,
ПараметрЗаголовков: Объект?)
знч ЗаголовокWss = ЗаписьSoap.СоздатьЗаголовок("Security", ПРОСТРАНСТВО_WSS)

если ПараметрЗаголовков это ЗаголовокТокенПользователя
ЗаголовокWss.ЗаписатьНачалоЭлемента("UsernameToken", ПРОСТРАНСТВО_WSS)

знч ТокенПользователя = ПараметрЗаголовков как ЗаголовокТокенПользователя
ЗаголовокWss.ЗаписатьНачалоЭлемента("Username", ПРОСТРАНСТВО_WSS)
ЗаголовокWss.ЗаписатьТекст(ТокенПользователя.Пользователь)
ЗаголовокWss.ЗаписатьКонецЭлемента()

ЗаголовокWss.ЗаписатьНачалоЭлемента("Password", ПРОСТРАНСТВО_WSS)
ЗаголовокWss.ЗаписатьТекст(ТокенПользователя.Пароль)
ЗаголовокWss.ЗаписатьКонецЭлемента()

ЗаголовокWss.ЗаписатьКонецЭлемента()
;

ЗаголовокWss.ЗаписатьКонецЭлемента()
;

При вызове метода ДобавитьВКаталог необходимо указать данные, которые требуется записать в SOAP-заголовок. Объект ДанныеТокена передается в обработчик НастроитьЗаголовкиSoapДобавитьВКаталог через параметр ПараметрЗаголовков.

знч КлиентСервиса = новый КлиентСервисаМагазина()
знч НовыйТовар = новый КлиентСервисаМагазина.Товар(Количество, Наименование)
знч ДанныеТокена = новый КлиентСервисаМагазина.ЗаголовокТокенПользователя("User", "Password")
знч ОтветСервиса = КлиентСервиса.ДобавитьВКаталог(НовыйТовар, ДанныеТокена)