Welcome Guest ( Вход | Регистрация )



Часовой пояс: UTC + 6 часов



Начать новую тему Ответить на тему  [ Сообщений: 3 ] 
Автор Сообщение
 Заголовок сообщения: Создание внешнего веб-сервиса (Действие WS-клиаент)
СообщениеДобавлено: 18 мар 2016, 18:58 
Аватар пользователя

Зарегистрирован: 30 окт 2014, 17:29
Сообщений: 166

Не в сети
Коллеги, добрый день!
Я заметил, что многие из нас "ломают копья" в стремлении "запилить" систему под себя и расширить функционал системы Detrix посредством написания внешнего веб-сервиса.
Информации в интернете по теме крайне мало, много на английском и, честно говоря, лично мне было ну оооочень лень изучать эту тему, так как к моей основной работе разработка web-приложений не имеет отношения.
Однако, деваться некуда, пришлось разбираться, потому хочу поделиться собранными знаниями и рабочим примером ws-сервиса с теми, кто только собирается заняться этим неблагодарным делом.
Предлагаю в дальнейшем в данной теме собрать все накапливаемые знания по этому вопросу.

Итак, немного теории. Ключевые понятия:
Веб-сервис (веб-служба, web-service) — это реализация четких интерфейсов обмена данными между различными приложениями, которые написаны не только на разных языках, но и распределены на разных узлах сети. В нашем случае это некий скрипт, который будет производить какие-либо вычисления с данными, которые мы ему передадим из detrix, и возвращать некий результат обратно.
SOAP (Simple Object Access Protocol) - один из разновидностей протоколов для работы с веб-сервисами. Остальные нас не интересуют, так как detrix поддерживает только этот
WSDL (Web Services Description Language ) - XML файл определенного формата.

Реализация веб-сервиса подразумевает 3 составляющие:
1. Клиент (в нашем случае это detrix)
2. Сервер (в моём примере это будет php-скрипт)
2. WSDL-файл (пояснение для клиента как работать с нашим сервером)

С клиентом всё понятно, описание его работы представлено здесь - http://www.detrix.kz/2012/05/23/opisanie-dejstvij-sed-detrix-ws-klient/
Пример сервера:
Код:
<?php
Class MyClass
{
   function MyFunction ($var1, $var2)
   { 
   $result = $var1+$var2;
   return $result;
   }
}
ini_set("soap.wsdl_cache_enabled", "0"); // на время тестирования отключает кэширование запросов
$server = new SoapServer("http://sed/modules/ws-extension/example5.wsdl");  // путь до wsdl-файла
$server->setClass("MyClass");  // указываем какой класс будет использоваться в веб-сервисе
$server->handle(); // запускаем сервис "на прослушивание"
?>


Вкратце смысл такой: мы создаём некий класс MyClass, в нём создаём некую функцию myFunction, которая получит от detrix значения переменных $var1 и $var2, просуммирует и вернёт detrix результат.
Проще говоря, нас интересует в этом файле всего 2 момента, а именно адрес к нашему wsdl файлу и содержание функции myFunction
Для того чтобы кастомизировать мой файл под себя достаточно изменить эти 2 блока в соответствии с вашими пожеланиями

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

Код:
<?xml version='1.0' encoding='UTF-8'?>
<definitions name="server" targetNamespace="urn:server" xmlns:typens="urn:server" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns="http://schemas.xmlsoap.org/wsdl/">

   <message name="MyFunction">
      <part name="var1" type="xsd:string"/>
      <part name="var2" type="xsd:string"/>
   </message>
   <message name="MyFunctionResponse">
      <part name="MyFunctionReturn" type="xsd:string"/>
   </message>

   <portType name="MyClassPortType">
      <operation name="MyFunction">
         <input message="typens:MyFunction"/>
         <output message="typens:MyFunctionResponse"/>
      </operation>
   </portType>

   <binding name="MyClassBinding" type="typens:MyClassPortType">
      <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
      <operation name="MyFunction">
         <soap:operation soapAction="urn:MyClassAction"/>
         <input>
            <soap:body namespace="urn:server" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
         </input>
         <output>
            <soap:body namespace="urn:server" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
         </output>
      </operation>      
   </binding>

   <service name="MyName">
      <port name="MyClassPort" binding="typens:MyClassBinding">
         <soap:address location="http://example.com/server.php"/>
      </port>
   </service>
</definitions>



"Вот это хренотеть" подумаете вы, но не пугайтесь, всё не так страшно, да и для написания своего сервиса практически не нужно разбираться в его синтаксисе
Для страждущих всё же поясню. Файл разделён на блоки:
- <service name="MyName"> - определение службы;
- <binding name="MyClassBinding" type="typens:MyClassPortType"> - формат методов;
- <portType name="MyClassPortType"> - привязка сообщений к методам;
- <message name='MyMessage' /> - сообщения метода MyMessage.
- <port name="MyClassPort" binding="typens:MyClassBinding"> - точка входа ("port"), которая называется "MyClassPort"в которую будут отправляться все запросы от клиентов к серверу
- <soap:address location="http://example.com/server.php"/> - путь к нашему веб-сервису

Теперь посмотрим, что из этого файла нас интересует по факту:

1. Блок <message>
<message name="MyFunction">
<part name="var1" type="xsd:string"/>
<part name="var2" type="xsd:string"/>
</message>


<part> - это то, что мы будем передавать серверу из detrix. в нашем случае это две переменные $var1 и $var2.
type - здесь указывается тип передаваемых данных, в данном случае строка, но есть и другие, кому интересно можно ознакомиться, например, тут - https://docs.oracle.com/cd/E19182-01/821-0139/ghqgg/index.html


Именно эти "партсы" мы увидим, когда будем настраивать detrix на работу с нашим сервером
Изображение

Мы можем записать сколько угодно "партсов" в блок message

2. Путь к нашему веб-сервису

Остальное можно не менять, если ваш внутренний перфекционист не приходит в ярость от универсальности названия блоков :)


Осталось лишь протестировать работу нашего сервиса.
Настроим клиент (Detrix) для работы с нашим сервером.
Для этого создадим новый тип документа следующим образом:
1. Добавим 3 поля "Слагаемое1" и "Слагаемое2" и "Результат", тип всех полей - "строка"
2. В шаблоне документа выведем наши поля
3. Создадим действие WS-клиент и укажем ему путь к нашему wsdl файлу. Затем выберем функцию myFunction и установим соответствие полей нашим переменным:

Изображение

4. Создадим первую точку маршрута и делегируем это действие себе

Теперь создадим сам документ этого типа и укажем какие-нибудь числа в полях слагаемое 1 и 2 и выполним наше новоиспеченное действие.
Вауля.. )
Изображение

Надеюсь кому-то будет полезно.


 Профиль  
 
 Заголовок сообщения: Re: Создание внешнего веб-сервиса (Действие WS-клиаент)
СообщениеДобавлено: 18 мар 2016, 19:02 
Аватар пользователя

Зарегистрирован: 30 окт 2014, 17:29
Сообщений: 166

Не в сети
Ещё хочу добавить ссылки на темы по известным мне багам на сегодняшний день:
1. Проблема с возвратом значений в поле формата "дата" - http://forum.detrix.kz/viewtopic.php?f=9&t=9134
2. Проблема с делегированием полномочий [РЕШЕНО] - http://forum.detrix.kz/viewtopic.php?f=13&t=8351&hilit=ws+%D0%BA%D0%BB%D0%B8%D0%B5%D0%BD%D1%82


 Профиль  
 
 Заголовок сообщения: Re: Создание внешнего веб-сервиса (Действие WS-клиаент)
СообщениеДобавлено: 14 сен 2017, 15:26 

Зарегистрирован: 26 мар 2014, 16:14
Сообщений: 204
Откуда: Магнитогорск

Не в сети
Сделал все точь в точь, как написано - не работает - после выполнения действия с ws пустая страница....
Отсюда пара вопросов
1. Там где написано "пример сервера" сохраняем в php с любым именем?
2. в http://sed/modules/ws-extension/example5.wsdl - <soap:address location="http://example.com/server.php"/> - путь к нашему веб-сервису - это и есть путь до файла из п.1?


 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 3 ] 

Часовой пояс: UTC + 6 часов


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти: