Учебники

2) Простой протокол доступа к объектам

Что такое SOAP?

SOAP — это основанный на XML протокол для доступа к веб-сервисам по HTTP. У него есть некоторая спецификация, которая может быть использована во всех приложениях.

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

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

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

SOAP Введение

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

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

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

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

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

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

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

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

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

Спецификация SOAP определяет нечто, известное как « сообщение SOAP », которое отправляется веб-службе и клиентскому приложению.

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

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

Сообщение SOAP — это не что иное, как простой XML-документ, который имеет следующие компоненты.

  • Элемент Envelope, который идентифицирует XML-документ как сообщение SOAP. Он содержит часть сообщения SOAP и используется для инкапсуляции всех деталей в сообщении SOAP. Это корневой элемент в сообщении SOAP.
  • Элемент Header, содержащий информацию заголовка. Элемент header может содержать такую ​​информацию, как учетные данные для аутентификации, которые могут использоваться вызывающим приложением. Он также может содержать определение сложных типов, которые могут использоваться в сообщении SOAP. По умолчанию сообщение SOAP может содержать параметры, которые могут быть простых типов, таких как строки и числа, но также могут быть сложным типом объекта.

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

Предположим, что мы хотим отправить структурированный тип данных, который имеет комбинацию «Имя учебника» и «Описание учебника», тогда мы определим сложный тип, как показано ниже.

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

<xsd:complexType>     
 <xsd:sequence>       
 	<xsd:element name="Tutorial Name" type="string"/>         
  	<xsd:element name="Tutorial Description"  type="string"/>
  </xsd:sequence>
</xsd:complexType>
  • Элемент Body, который содержит информацию о вызове и ответе. Этот элемент содержит фактические данные, которые необходимо отправить между веб-службой и вызывающим приложением. Ниже приведен пример тела SOAP, которое фактически работает со сложным типом, определенным в разделе заголовка. Вот ответ Имя учебника и Описание учебника, которое отправляется вызывающему приложению, которое вызывает эту веб-службу.
<soap:Body>
   <GetTutorialInfo>
		<TutorialName>Web Services</TutorialName> 
		<TutorialDescription>All about web services</TutorialDescription> 
   </GetTutorialInfo>
</soap:Body>

Структура сообщения SOAP

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

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

Как обсуждалось в предыдущем разделе, простое сообщение SOAP имеет следующие элементы:

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

Давайте рассмотрим приведенный ниже пример простого сообщения SOAP и посмотрим, что на самом деле делает элемент.

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

  1. Как видно из приведенного выше сообщения SOAP, первая часть сообщения SOAP является элементом конверта, который используется для инкапсуляции всего сообщения SOAP.
  2. Следующий элемент — это тело SOAP, в котором содержатся подробные данные фактического сообщения.
  3. Наше сообщение содержит веб-сервис с названием «Guru99WebService».
  4. «Guru99Webservice» принимает параметр типа «int» и имеет имя TutorialID.

Теперь вышеуказанное SOAP-сообщение будет передаваться между веб-службой и клиентским приложением.

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

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

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

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

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

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

  • Каждое сообщение SOAP должно иметь корневой элемент Envelope. Для сообщения SOAP абсолютно обязательно иметь элемент конверта.
  • Каждый элемент Envelope должен иметь хотя бы один элемент мыльного тела.
  • Если элемент Envelope содержит элемент header, он должен содержать не более одного элемента и должен отображаться как первый дочерний элемент Envelope перед элементом body.
  • Конверт изменяется при изменении версий SOAP.
  • Процессор SOAP, совместимый с v1.1, генерирует ошибку при получении сообщения, содержащего пространство имен конверта v1.2.
  • Процессор SOAP, совместимый с v1.2, генерирует ошибку несоответствия версий, если он получает сообщение, которое не включает пространство имен конверта v1.2.

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

<?xml version="1.0"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://www.w3.org/2001/12/soap-envelope" SOAP-ENV:encodingStyle=" http://www.w3.org/2001/12/soap-encoding">
          <soap:Body>
        <Guru99WebService xmlns="http://tempuri.org/">
                  <TutorialID>int</TutorialID>
                </Guru99WebService>
          </soap:Body>
</SOAP-ENV:Envelope>

Сообщение о неисправности

Когда выполняется запрос к веб-службе SOAP, возвращаемый ответ может иметь либо 2 формы, которые являются успешным ответом, либо ответом об ошибке. При успешном генерировании ответ от сервера всегда будет SOAP-сообщением. Но если генерируются ошибки SOAP, они возвращаются как ошибки «HTTP 500».

Сообщение о сбое SOAP состоит из следующих элементов.

  1. <faultCode> — это код, обозначающий код ошибки. Код ошибки может быть любым из следующих значений
    1. SOAP-ENV: VersionMismatch — это когда встречается недопустимое пространство имен для элемента конверта SOAP.
    2. SOAP-ENV: MustUnderstand — Непонятный непосредственный дочерний элемент элемента Header с атрибутом mustUnderstand, установленным в «1».
    3. SOAP-ENV: Клиент — Сообщение было сформировано неправильно или содержало неверную информацию.
    4. SOAP-ENV: Сервер — возникла проблема с сервером, поэтому сообщение не удалось продолжить.
  2. <faultString> — это текстовое сообщение, которое дает подробное описание ошибки.
  3. <faultActor> (необязательно) — это текстовая строка, которая указывает, кто вызвал ошибку.
  4. <detail> (Необязательно) — это элемент для сообщений об ошибках для конкретного приложения. Таким образом, приложение может иметь конкретное сообщение об ошибке для различных сценариев бизнес-логики.

Пример сообщения об ошибке

Пример сообщения об ошибке приведен ниже. Ошибка генерируется, если сценарий, в котором клиент пытается использовать метод с именем TutorialID в классе GetTutorial.

Приведенное ниже сообщение об ошибке генерируется в том случае, если метод не существует в определенном классе.

<?xml version='1.0' encoding='UTF-8'?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance" xmlns:xsd="http://www.w3.org/1999/XMLSchema">
      <SOAP-ENV:Body>
         <SOAP-ENV:Fault>
         <faultcode xsi:type="xsd:string">SOAP-ENV:Client</faultcode>
        <faultstring xsi:type="xsd:string">
            Failed to locate method (GetTutorialID) in class (GetTutorial)
         </faultstring>
    </SOAP-ENV:Fault>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Вывод:

Когда вы выполните приведенный выше код, он покажет ошибку типа «Не удалось найти метод (GetTutorialID) в классе (GetTutorial)»

Модель связи SOAP.

Вся связь по SOAP осуществляется по протоколу HTTP. До SOAP многие веб-сервисы использовали стандартный стиль RPC (удаленный вызов процедур) для связи. Это был самый простой тип общения, но у него было много ограничений.

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

  • GetEmployee — получит все данные сотрудника
  • SetEmployee — Это установит значение деталей, таких как отдел сотрудников, зарплата и т. Д. Соответственно.

При обычной связи в стиле RPC клиент просто вызывает методы в своем запросе и отправляет необходимые параметры на сервер, а затем сервер отправляет желаемый ответ.

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

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

  1. Не зависит от языка — сервер, на котором размещены методы, будет на определенном языке программирования, и обычно вызовы к серверу будут выполняться только на этом языке программирования.
  2. Нестандартный протокол. Когда выполняется удаленная процедура, вызов не выполняется по стандартному протоколу. Это было проблемой, поскольку в основном все общение через Интернет должно было осуществляться по протоколу HTTP.
  3. Межсетевые экраны — поскольку вызовы RPC не проходят по обычному протоколу, на сервере должны быть открыты отдельные порты, чтобы клиент мог обмениваться данными с сервером. Обычно все брандмауэры блокируют такой трафик, и, как правило, требуется много конфигурации для обеспечения того, чтобы этот тип связи между клиентом и сервером работал.

Чтобы преодолеть все ограничения, указанные выше, SOAP будет использовать следующую модель связи

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

  1. Клиент форматирует информацию о вызове процедуры и любых аргументах в сообщение SOAP и отправляет ее на сервер как часть HTTP-запроса. Этот процесс инкапсуляции данных в сообщение SOAP был известен как Marshalling.
  2. Затем сервер развернет сообщение, отправленное клиентом, увидит, что запросил клиент, а затем отправит соответствующий ответ клиенту в виде сообщения SOAP. Практика развертывания запроса, отправленного клиентом, известна как Demarshalling.

Практический пример SOAP

Давайте посмотрим на практический пример,

Вероятно, один из лучших способов увидеть, как генерируются SOAP-сообщения, — это реально увидеть веб-сервис в действии.

В этом разделе рассматривается использование инфраструктуры Microsoft.Net для создания веб-службы ASMX. Этот тип веб-службы поддерживает SOAP версии 1.1 и 1.2.

Веб-службы ASMX автоматически создают документ языка определения веб-служб (WSDL). Этот WSDL-документ требуется вызывающему клиентскому приложению, чтобы приложение знало, на что способен веб-сервис.

В нашем примере мы собираемся создать простой веб-сервис, который будет использоваться для возврата строки в приложение, которое вызывает веб-сервис.

Этот веб-сервис будет размещен в веб-приложении Asp.Net . Затем мы вызовем веб-сервис и увидим результат, который возвращается веб-сервисом.

Visual Studio также покажет нам, что SOAP-сообщение передается между веб-службой и вызывающим приложением.

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

Пожалуйста, убедитесь, что у вас установлена ​​Visual Studio 2013 в вашей системе для этого примера.

Шаг 1) Первый шаг — создать пустое веб-приложение ASP.Net. В Visual Studio 2013 щелкните пункт меню Файл-> Новый проект.

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

После того, как вы нажмете на опцию «Новый проект», Visual Studio предоставит вам другое диалоговое окно для выбора типа проекта и предоставления необходимых деталей проекта. Это объясняется на следующем шаге.

Шаг 2) На этом этапе

  1. Обязательно сначала выберите веб-шаблон C # веб-приложения ASP.NET. Проект должен быть такого типа, чтобы создать проект веб-сервисов. Выбрав этот параметр, Visual Studio затем выполнит необходимые шаги для добавления необходимых файлов, которые требуются для любого веб-приложения.
  2. Дайте название вашему проекту, который в нашем случае был назван webservice.asmx. Затем обязательно укажите место, где будут храниться файлы проекта.

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

После этого вы увидите файл проекта, созданный в обозревателе решений в Visual Studio 2013.

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

Шаг 3) На этом этапе

Мы собираемся добавить файл веб-службы в наш проект

  1. Сначала щелкните правой кнопкой мыши файл проекта, как показано ниже

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

  1. После того, как вы щелкнете правой кнопкой мыши по файлу проекта, у вас будет возможность выбрать опцию «Добавить-> Веб-служба (ASMX)» для добавления файла веб-службы. Просто укажите имя Tutorial Service для файла имени веб-службы.

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

Шаг 4) Добавьте следующий код в файл asmx Tutorial Service.

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

Объяснение кода:

  1. Эта строка кода предоставляет имя для вашего файла веб-службы. Это важный шаг, поскольку он позволяет клиентскому приложению вызывать веб-службу через имя веб-службы.
  2. Обычно файл класса используется для инкапсуляции функциональности веб-службы. Таким образом, файл класса будет иметь определение всех веб-методов, которые предоставят некоторую функциональность клиентскому приложению.
  3. Здесь [WebMethod] известен как атрибут, который описывает функцию. На следующем шаге создается функция с именем «Guru99WebService», но с включением этого шага добавления атрибута [WebMethod] гарантируется, что этот метод может быть вызван клиентским приложением. Если этот атрибут отсутствует, метод никогда не может быть вызван клиентским приложением.
  4. Здесь мы определяем функцию под названием Guru99WebService, которая будет использоваться для возврата строки в вызывающее клиентское приложение. Эта функция представляет собой веб-сервис, который может вызываться любым клиентским приложением.
  5. Мы используем оператор return, чтобы вернуть строку «Это веб-сервис Guru99» клиентскому приложению.

Если код выполнен успешно, при запуске кода в браузере будет показан следующий вывод.

Вывод:

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

  • Вывод ясно показывает, что название нашего веб-сервиса называется «Веб-сервис Guru99», что является результатом присвоения имени нашему веб-сервису.
  • Мы также видим, что мы можем вызвать веб-сервис. Если мы нажмем кнопку Invoke, мы получим ответ ниже в веб-браузере.

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

Вышеуказанный вывод,

  • Это ясно показывает, что при вызове веб-метода возвращается строка «Это веб-служба Guru99».
  • Visual Studio также позволяет просматривать запрос и ответ SOAP-сообщения, которые генерируются при вызове вышеуказанного веб-сервиса.

Запрос SOAP, который генерируется при вызове веб-службы, показан ниже.

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

Объяснение кода:

  1. Первая часть сообщения SOAP — это элемент конверта, который обсуждался в предыдущих главах. Это инкапсулирующий элемент, который присутствует в каждом сообщении SOAP.
  2. Тело SOAP является следующим элементом и содержит фактические детали сообщения SOAP.
  3. Третья часть — это элемент, который указывает, что мы хотим вызвать службу, которая называется Guru99WebService.

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

<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  
    <soap:Body>
      
        <Guru99WebServiceResponse xmlns="http://tempuri.org/">
          
            <Guru99WebServiceResult>string</Guru99WebServiceResult>
          
        </Guru99WebServiceResponse>
    </soap:Body>
</soap:Envelope>

Объяснение кода:

  1. Первая часть сообщения SOAP — это элемент конверта, который обсуждался в предыдущих главах. Это инкапсулирующий элемент, который присутствует в каждом сообщении SOAP.
  2. Тело SOAP является следующим элементом и содержит фактические детали сообщения SOAP.
  3. Интересная часть, которую вы увидите сейчас, это атрибут ‘string’. Это сообщает клиентскому приложению, что вызываемый веб-сервис возвращает объект типа string. Это очень полезно, потому что, если клиентское приложение, которое иначе не будет знать, что возвращает веб-сервис.

Резюме

  • SOAP — это протокол, который используется для обмена данными между приложениями, построенными на разных языках программирования.
  • SOAP построен на спецификации XML и работает с протоколом HTTP. Это делает его идеальным для использования в веб-приложениях.
  • Строительные блоки SOAP состоят из сообщения SOAP. Каждое сообщение SOAP состоит из элемента envelope, заголовка и элемента body.
  • Элемент envelope является обязательным элементом в сообщении SOAP и используется для инкапсуляции всех данных в сообщении SOAP.
  • Элемент заголовка может использоваться для хранения информации, такой как информация об аутентификации или определение сложных типов данных.
  • Элемент body является основным элементом, который содержит определение веб-методов вместе с любой информацией о параметрах, если требуется.