
- •Iis и xml функции sql Server
- •Поддержка xml в Microsoft sql Server 2000
- •Примеры
- •Iis и xml функции sql Server
- •Шаблоны
- •Запросы xPath
- •Замечания по разделу
- •Возможности ado 2.5 Сохранение и загрузка из файла в формате xml
- •Трансформация с помощью domDocument
- •Выдача Recordset’а в формате xml непосредственно в поток Response
- •Возможности ado 2.6
- •Использование Command для формирования xml-документа на сервере
- •Выполнение шаблона
- •Выполнение запроса xPath
- •Шаблон с агрегатными функциями
- •Формирование xml-документа на клиенте с помощью ado
- •Апдейтаграммы и xml Bulk Load
- •Апдейтаграммы
- •Добавление данных
- •Обновление данных
- •Удаление
- •Создание новой таблицы и загрузка данных
- •Загрузка иерархических документов
- •Заключение
- •Литература
- •Предисловие
- •Настройка iis
- •Содержание wsdl-файла
- •Секция types
- •Секция message
- •Секция portType
- •Формы сообщений
- •Секция binding
- •Секция service
- •Создание Web-методов
- •Тестируем Web-сервис
- •Поддержка sqlxml в .Net Framework
- •Тестовый проект
- •Цели и ограничения
- •Реализация
- •Заключение
- •Литература
- •Тип данных xml Основы
- •Метод query
- •Метод value
- •Метод exist
- •Метод modify
- •Использование xml-типа
- •Хранение xml-типа
- •Поддержка xml Schema
- •Создание схемы
- •Удаление схемы
- •Ограничения текущей реализации
- •Безопасность
- •Вложенные запросы for xml
- •Генерация xsd на лету
- •Поддержка xQuery
- •Тело запроса
- •Конструкторы узлов
- •Операторы сравнения
- •Операторы сравнения атомарных значений
- •Общие операторы сравнения
- •Операторы сравнения узлов
- •Логические операторы
- •Условные выражения
- •Flwor-выражения
- •Кванторные выражения
- •Сортировка
- •Заключение
- •Литература
Тестируем 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. Производительность, как минимум, не хуже, а наглядность и удобство на порядок выше.