Visual studio soap запрос

Обновлено: 03.07.2024

Я обнаружил, что могу импортировать службу SOAP/WSDL, которую я планирую использовать в своем решении либо в качестве "ссылки на веб-службу" (система.Сеть.Услуги) или как "справочник по услугам" (система.ServiceModel / WCF).

предпочтительным и наиболее полезным способом действительно является использование Add Service Reference . Это добавит вашу службу в качестве прокси-сервера на стороне клиента WCF.

WCF-гораздо лучший выбор, чем ASMX, потому что:

да, WCF имеет плохой рэп о том, что очень трудно учиться - я действительно не считаю, что это правда. Проверьте эти новички ресурсы-действительно очень полезны!

у меня есть приложение, которое вызывает существующую службу SOAP, написанную в J2EE и размещенную в WebSphere.

Я создал два консольных приложения - одно, ссылающееся на службу как на веб-службу старой школы, а другое, ссылающееся на нее как на ссылку на службу.

в обоих случаях Visual Studio создает прокси-класс и соответствующие записи конфигурации для сервиса.

вот как выглядит конфигурация в приложении Service Reference:

в моем старом приложении консоли веб-службы школы мне не пришлось изменять конфигурация вообще, чтобы вернуть гигантский набор данных, отправленных обратно. Вот как выглядит его конфигурация:

это намного проще, но не хватает много вариантов, которые мы получаем со ссылками на службы.

фактический код вызова службы почти идентичен в обоих случаях.

Я думаю, что способ WCF более гибкий, и конфигурация намного более описательна о том, что происходит.

кроме того, когда вы добавляете новые компоненты WCF в свои приложения, будет неплохо сохранить настройки конфигурации согласованными, вместо смешивания и сопоставления между старой школой и WCF.

Я думаю, что одно из различий заключается в автогенерированном прокси-коде для службы. Если вы идете со ссылкой на службу, вашему приложению потребуется уровень WCF для связи. Обычно это не проблема, но если вы пишете код, который будет выполняться на других платформах (например, Mono), вы захотите использовать ссылку на веб-службу (поскольку Mono еще не поддерживает WCF.)

SOAP известен как простой протокол доступа к объектам, но в более поздние времена был сокращен до SOAP v1.2. SOAP — это протокол, или, другими словами, это определение того, как веб-сервисы взаимодействуют друг с другом или взаимодействуют с клиентскими приложениями, которые их вызывают.

SOAP был разработан как промежуточный язык, чтобы приложения, построенные на разных языках программирования, могли легко общаться друг с другом и избегать чрезмерных усилий по разработке.

В этом уроке вы узнаете

SOAP Введение

Обмен данными между приложениями имеет решающее значение в современном сетевом мире. Но обмен данными между этими разнородными приложениями будет сложным. Так же будет сложность кода для осуществления этого обмена данными.

Одним из методов, используемых для борьбы с этой сложностью, является использование XML (Extensible Markup Language) в качестве промежуточного языка для обмена данными между приложениями.

Каждый язык программирования может понимать язык разметки XML. Следовательно, XML был использован в качестве основного средства для обмена данными.

Но нет стандартных спецификаций использования XML для обмена данными на всех языках программирования. Вот где приходит SOAP.

Преимущества SOAP

SOAP — это протокол, используемый для обмена данными между приложениями. Ниже приведены некоторые из причин использования SOAP.

SOAP Строительные блоки

SOAP - простой протокол доступа к объектам

Простой пример сложного типа показан ниже.

Составной тип определяется тегом элемента <xsd: complexType>. Все необходимые элементы структуры вместе с их соответствующими типами данных затем определяются в коллекции сложных типов.

  • Элемент конверта
  • Элемент заголовка и
  • Элемент тела
  • Элемент неисправности (необязательно)

SOAP - простой протокол доступа к объектам

Элемент конверта SOAP

Первый бит строительного блока — конверт SOAP.

Следующие пункты могут быть отмечены в элементе конверта SOAP.

Ниже приведен пример версии 1.2 элемента конверта SOAP.

В этой статье хотелось бы поделиться опытом, полученном специалистами компании Metric, при разработке Web-сервисов для компании Аэрофлот.

Описание задачи

Необходимо реализовать сервис, который бы мог предоставлять максимально широкому кругу потребителей информацию о рейсах Аэрофлота. Текущее актуальное расписание рейсов, а также справку о рейсах. Данная информация может быть интересна и востребована различными компаниями. Например, компания-разработчик программного обеспечения для турагентств может интегрировать эту информацию в свой продукт, чтобы менеджер агентства всегда имел под рукой актуальное расписание, а также мог уведомить клиентов о задержках по его рейсу. Туристические сайты, используя данную информацию, могут предоставлять более высокий сервис для своих клиентов. Наконец, компания, чьи сотрудники регулярно летают в командировки, может встроить работу с данной информацией в свой корпоративный портал.

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

Чтобы реализовать такой сервис необходимо уметь получать аргументы, возвращать и разбирать сложные структуры данных. В результате проведенных экспериментов получен некоторый опыт, которым мы и делимся в этой статье.

  • Используйте атрибут SoapRpcService
  • Возвращайте массивы объектов, а не массивы структур.
  • Избегайте использования типа dateTime в аргументах.

Используйте SoapRpcService

Возвращайте массив объектов, а не массив структур.

Поэтому, Вам необходимо объявить публичный класс и возвращать массив элементов этого класса.

Избегайте использование типа dateTime в аргументах.

При написании клиентов пришлось столкнуться с тем, что попытки передачи дат из разных языков часто приводили к ошибке. WebService не желал воспринимать дату в передаваемом формате. Поэтому, чтобы упростить процедуру взаимодействия с сервисом, лучше такие параметры объявлять строковыми, а приведение выполнять уже внутри функции. Так с сервисом будет просто проще работать.

Пишем клиентов

Сервис создан и продемонстрируем, как к нему обращаться из разных языков программирования.

В качестве примера будет демонстрироваться вызов функции получения табло прилета по аэропорту Шереметьево 1 (код SVO1) за текущий день. После получения результата будем печатать следующие поля:

  • Компания
  • Рейс
  • Аэропорт
  • Дата по расписанию
  • Ожидаемая дата

Клиент на Perl

Для написания клиентов на Perl мы рекомендуем использовать удобный и простой модуль SOAP::Lite. Для тестирования использовалась версия 0.52. Данная версия уже корректно поддерживает работу с WSDL файлами.(В предыдущей версии была необходимость сохранять WSDL файл вручную и далее выполнять некоторые замены, но с этой версии необходимость в этом отпала).

Во время написания клиента столкнулись только с одним некорректным поведением модуля, а именно, игнорированием типа, описанного в WSDL файле и попыткой автоматического выставления типа. Если происходит вызов метода, которому в качестве значения строкового параметра передается строка, содержащая только число, то в теле SOAP-запроса SOAP::Lite указывает его, как тип int. Что приводит к ошибке вызова из-за несовпадения типов параметров. Возможно, в следующих версиях SOAP::Lite эта ошибка будет исправлена, а пока достаточно принудительно указывать тип аргументов при их вызове.

Программа-клиент выглядит следующим образом:

Как видите, все довольно просто.

Клиент на PHP

Для реализации клиентов на PHP рекомендуем использовать модуль NuSOAP.
В принципе, этот пример мало чем отличается от предыдущего.

Клиент на VB 6.0

Работать SOAP на VB 6.0 можно с использованием Microsoft Soap Toolkit 2.0. Если Вы используете только простые типы, то никакой дополнительной работы выполнять не нужно, Soap Toolkit самостоятельно знает, как ему преобразовывать базовые типы в XML и обратно. Но когда возникает необходимость в передаче сложных типов (структур, классов), то тут ему нужно помочь.

Обработка сложных типов в Soap Toolkit
Для передачи сложных типов в Soap Toolkit существуют две возможности:

  • Каждый раз при получении/передаче значений данного типа самостоятельно разбирать XML, работая с объектом типа IXMLDOMNodeList
  • Написать специализированный обработчик типа.

Для создания и использования специализированного обработчика типа необходимо:

  • Создать класс, который соответствует передаваемому или получаемому сложному типу.
  • Создать класс-обработчик для этого типа, который будет преобразовывать объекты данного класса в XML и обратно.
  • Создать WSML-файл, в котором настроить соответствие типа и его обработчика.
  1. Не используейте один обработчик(mapper) для всех полей, а создавайте свой для каждого поля структуры/объекта и определяйте тип динамически. Тогда, при смене типа данных одного из полей, даже с простого на сложный, ничего изменять не придется, система все отработает автоматически.
  2. Сложные типы в WSDL файле могут включать элементы в строгом(sequence) или в произвольном(all) порядке . Это надо учитывать при инициализации (Set Node = pSchema.selectSingleNode("XSD:sequence/XSD:element[@name='city']"))
  3. Не все поля структуры могут быть обязательными. Поэтому, прежде чем вызвать обработчик поля, проверьте, есть ли значение (pNode.selectSingleNode("city") is nothing). Иначе произойдет ошибка.

Подготовительная работа завершена и можно осуществлять вызов.

Вызов сервиса

Клиент на ASP

Для работы с сервисом из ASP также необходимо использовать Soap Toolkit. Только в отличие от VB есть одна маленькая неприятность. Дело в том, что в результате вызова функций сервиса возвращается либо массив объектов (Variant/Object), либо массив дат (Variant/Date), как в функции DateList. При этом VBScript работает только с типом данных Variant. Поэтому и обрабатываемый массив должен содержать тип Variant (Variant/Variant). Иначе обращение к любому элементу массива вызовет ошибку «Несовпадение типов».

Проблема решается очень просто. Добавим в специализированный обработчик класса, который мы уже создавали функцию MakeVariantArray, преобразующую переданный ей массив элементов в массив элементов типа Variant.

Используйте данный веб-сервис для авторизации в проекте и получения авторизационного ключа, используемого для работы с остальными веб-сервисами Devprom ALM.

Протокол: SOAP, WebService

Методы

login (string userName, string userPassword, string projectName)

Выполняет авторизацию пользователя в проекте.

  • переменная projectName может содержать кодовое название проекта. В этом случае осуществляется авторизация внутри проекта и пользователь может получить данные из проекта: задачи, пожелания и т.п.
  • если переменная projectName содержит пустую строку, то пользователь авторизуется в системе, но не может получить данные проекта.

Возвращает объект, содержащий авторизационные данные.

Классы

Ключ для авторизации пользователя при выполнении методов веб-сервисов.

TestService API

Используйте данный веб-сервис для создания тестовой документации, запуска тестов и отметки результатов выполнения тестов. Использование сервиса доступно после авторизации. Все методы сервиса в качестве первого параметра принимают ключ, полученный после авторизации.

Протокол: SOAP, WebService

Методы

Create (string token.Key, TestScenario object)

Создание нового раздела тестовой документации, привязанного к корневому узлу тестовой документации. Атрибуты нового раздела передаются в параметре object. Возвращает объект, описывающий созданный тестовый раздел.

Find (string token.Key, TestScenario object)

Загрузка атрибутов раздела тестовой документации по заданным параметрам, определенным в object. Если задать значение object.Id, то метод выполнит поиск по идентификатору тестового раздела. Если указать значение атрибута object.Caption, то - найдет раздел по его названию. Возвращает объект, описывающий искомый тестовый раздел.

Append (string token.Key, TestScenario parent, TestScenario object)

Создает новый подраздел тестовой документации в существующем разделе, идентифицируемом параметром parent. Возвращает объект, описывающий созданный тестовый подраздел.

Run (string token.Key, TestScenario object, string version, Environment environment)

Запускает на тестирование переданный в качестве параметра object тестовый раздел документации. Если у переданного тестового раздела есть дочерние разделы, то в тест будет включать в себя все дочерние разделы. При создании теста можно указать версию тестируемого приложения, а также окружение, на котором осуществляется тестирование. Окружение идентифицируется атрибутов environment.Caption. Необходимо заранее настроить справочник окружений в проекте. Метод возвращает объект, описывающий тест.

ReportResult(string token.Key, TestExecution execution, TestScenario object, TestExecutionResult result)

Отметка о результате тестирования тестового раздела (object) в составе теста (execution). Результат выполнения идентифицируется атрибутом result.ReferenceName.

ReportIssue (string token.Key, TestExecution execution, TestScenario object, Request request)

ReportFile (string token.Key, TestExecution execution, TestScenario object, Attachment file)

Загрузка в проект файла, связанного с результатами тестирования раздела (object) в составе теста (execution). Вы можете загрузить связанный с результатом снимок экрана, дамп или лог-файл.

GetResult (string token.Key, TestExecution execution)

Возвращает текущий результат выполнения теста в виде объекта TestExecutionResult.

Читайте также: