Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Использование XML совместно с SQL.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
1.39 Mб
Скачать

Тестируем Web-сервис

SOAP-сообщение – это простой XML-документ, который состоит из двух фрагментов: необязательного фрагмента Header и обязательного Body. Оба этих фрагмента должны находиться в корневом элементе Envelope. Чтобы понять, что SOAP – это довольно просто, давайте пока формировать запросы «ручками», используя для отправки пакетов компонент XMLHTTP. Все web-методы должны возвращать xml objects (см. рисунок 2).

XMLHTTP

Создавать SOAP-сообщения очень просто, если есть WSDL-документ, и вы его четко придерживаетесь. Будем двигаться небольшими шагами. Начнем с процедуры test_output. Сначала необходимо создать компонент XMLHTTP и сформировать начало SOAP-тела (Body).

VBScript

Dim xmlhttp

Set xmlhttp = CreateObject("Msxml2.XMLHTTP")

xmlhttp.open "POST","http://dcit06/srv/webserv",false

Dim soap_mes

soap_mes = "<?xml version=""1.0"" encoding=""windows-1251""?>" _

& "<soap:Envelope xmlns:soap=" _

& ""http://schemas.xmlsoap.org/soap/envelope/"">" _

& "<soap:Body>" _

& ...

Из WSDL-файла видно, что операция test_output состоит из запроса и ответа. Запрос определяется набором параметров test_outputIn (секция message под названием test_outputIn). Этот набор состоит из одного элемента test_output, в который вложен элемент i, представляющий собственно значение выходного параметра для метода., Тип элемента i - xsd:int, он может принимать значение nil. Дабы не привлекать пространство имен http://www.w3.org/2001/XMLSchema-instance, в котором определен атрибут nil, задающий пустое значение, просто передадим в качестве значения параметра i нуль.

Остаток скрипта

"<test_output xmlns=""http://dcit06/srv/webserv"">" & _

"<i>0</i>" & _

"</test_output>" & _

"</soap:Body>" & _

"</soap:Envelope>"

xmlhttp.send soap_mes

WScript.Echo "****************************************"

WScript.Echo vbTab & "Response for test_output"

WScript.Echo "----------------------------------------"

WScript.Echo xmlhttp.responseText

После формирования строки запроса можно вызывать Web-сервис и вывести результаты на консоль. Подобным же образом составляется тест для хранимой процедуры CustOrderHist и функции test_ret_func.

ПРЕДУПРЕЖДЕНИЕ

Мною замечена ошибка в SQLXML: параметры Web-метода трактуются как неквалифицированные элементы (unqualified elements), т.е. если написать запрос так:

<t:test_output xmlns:t="http://dcit06/srv/webserv">

<t:i>0</t:i>

</t:test_output> , то SQLXML вернет ошибку: The input parameter 't:i' is not a parameter to the stored procedure called. Если убрать префикс пространства имен у элемента i (как если бы он к нему не относился)– все проходит без ошибок.

Наверняка через некоторое (не слишком большое) время вам надоест создавать SOAP-сообщения вручную. Раз так, переходим к следующему разделу.

ПРИМЕЧАНИЕ

Прекрасным инструментом для отладки Web-сервисов является XMLSPY. Он автоматически на основе WSDL-файла создает сообщения SOAP (которые можно затем вручную отредактировать), позволяет вызвать Web-метод, а также может выступать в роли трассировщика, позволяя отлаживать Web-сервис.

SOAP Toolkit

Если вы никогда не работали с SOAP Toolkit, очень рекомендую замечательную статью Ивана Андреева «Использование протокола SOAP в распределенных приложениях».

SOAP Toolkit возвращает ответ в виде объекта типа IXMLDOMNodeList. Это коллекция элементов IXMLDOMNode, у которых есть свойство xml. Его-то мы и будем использовать для вывода результатов на консоль. В коде присутствует большое количество комментариев, поэтому больше ничего говорить не буду, смотрите сами:

Вызов функции test_output с помощью SOAP Toolkit:

'Создание высокоуровнего объекта SoapClient30, реализующего динамический IDispatch

'на основе информации из WSDL-файла

Dim SoapClient

Set SoapClient = CreateObject("MSSOAP.SoapClient30")

'Здесь происходит чтение WSDL, анализ и генерация IDispatch,

'который будет содержать все, указаные в WSDL операции

'В нашем случае это test_output, test_ret_func и CustOrderHist

SoapClient.MSSoapInit "http://dcit06/srv/webserv?wsdl"

Dim ReturnNodeList

Dim ret_val

'Вызываем Web-метод test_output. Возвращаемое значение сохраняется

'в переменной ret_val

'Часть необработанного SOAP-ответа возвращается в виде IXMLDOMNodeList

Set ReturnNodeList = SoapClient.test_output(ret_val)

'Вывод результатов на консоль

WScript.Echo "****************************************"

WScript.Echo vbTab & "Response for test_output"

WScript.Echo "----------------------------------------"

'Перебираем элементы и выводим их на консоль

For Each Node In ReturnNodeList

WScript.Echo Node.xml

Next

'Вывод на консоль возвращаемого значения

WScript.Echo "Return value is " & ret_val

.NET Framework

Уж с чем-чем, а с поддержкой Web-сервисов в .NET Framework все в порядке. По сравнению с SOAP Toolkit, здесь все гораздо проще и легче. Чтобы начать работу, нужно создать простое консольное приложение и добавить Web-ссылку (web reference) на Web-сервис.

Примеры вызовов Web-методов тривиальны, поэтому стоит упомянуть лишь передачу ответов в формате DiffGram. Для того чтобы это стало возможным, зайдите в консоль администрирования и задайте для процедуры CustOrderHist значение Output as DataSet objects. Ниже приводится полный пример VB.NET-программы получения результатов Web-метода как объекта DataSet.

Автоматическое создание объекта DataSet путем вызова метода ReadXml в режиме DiffGram

Module Module1

Sub Main()

Dim prx As dcit06.procedures1

Try

prx = New dcit06.procedures1

' В момент выхове метода CustOrderHist происходит следующее

' 1. Вызывается soap-метод CustOrderHist

' 2. xml-фрагмент в формате DiffGram извлекается из ответа

' 3. Происходит создание DataSet и вызов метода ReadXml

Dim response() As Object = prx.CustOrderHist("BLAUS")

' response(0) – готовый объект DataSet

' response(1) – код возврата хранимой процедуры

Dim ds As DataSet = response(0)

Finally

prx.Dispose()

End Try

End Sub

End Module

Надо сказать, что работать с Web-сервисами из .NET Framework значительно легче, чем через Soap Toolkit. Производительность, как минимум, не хуже, а наглядность и удобство на порядок выше.