Настройка заголовков исходящего 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")
знч ОтветСервиса = КлиентСервиса.ДобавитьВКаталог(НовыйТовар, ДанныеТокена)