Основные принципы интеграции информационных подсистем с подсистемой НСИ

Материал из Course Orchestra
Перейти к: навигация, поиск

Описание

Showcase предоставляет возможность интеграции с внешними приложениями посредством веб-сервисов.

Имя веб-сервиса: ShowcaseExternalsService

Адрес конечной точки (endpoint): ${showcase_app}/forall/webservices

WSDL: ${showcase_app}/forall/webservices?wsdl

XSD: ${showcase_app}/forall/webservices?xsd=1

где ${showcase_app} - URL развернутого Showcase.


Веб-сервис реализован в SOA стиле - т.е. посредством обмена сообщениями.

Обмен данными идет по протоколу http.

namespace по умолчанию для веб-сервиса - http://showcase.curs.ru.

Поддержка веб-сервисов реализована с помощью компоненты JAX-WS.

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

  • WS-I Basic Profile 1.2 and 2.0
  • WS-I Attachments Profile 1.0
  • WS-I Simple SOAP Binding Profile 1.0
  • WS-Addressing 1.0 - Core, SOAP Binding, WSDL Binding

Обмен сообщениями осуществляется при помощи передачи данных в виде XML документа. При необходимости возможна передача данных в виде строки.

Методы getGrains, getSelect, getInsert, getDelete, getUpdate

Используются для доступа к данным справочников, а также их модифицирования.

Метод getGrains

Возвращает список гранул, таблиц и их полей. Формат входящего сообщения для xml:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:show="http://showcase.curs.ru">
   <soapenv:Header>
      <show:procName>common.webservicefunc.getGrains.celesta</show:procName><!--Имя процедуры, которую необходимо выполнить-->
   </soapenv:Header>
   <soapenv:Body>
      <show:requestAnyXML>
          <command type="grains" param="">
               <pin>1C1SMFSRJQIEA1</pin><!--pin гостевого пользователь для веб сервиса-->
          </command>
      </show:requestAnyXML>
   </soapenv:Body>
</soapenv:Envelope>

Формат исходящего сообщения для xml:

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
   <S:Body>
      <ns2:responseAnyXML xmlns:ns2="http://showcase.curs.ru">
         <grains><!--Список гранул-->
            <grain name="zakupki"><!--Гранула и ее название-->
               <tables>
                  <table name="contracts"> <!--Таблица входящая в состав гранулы-->
                     <columns>
                         <column name="uid" primaryKey='True'/> <!--Поле таблицы. primaryKey - признак принадлежности поля к первичному ключу-->
                         <column name="purchase_id" primaryKey='False'/>
                         <column name="customer_id" primaryKey='False'/>
                         <column name="description" primaryKey='False'/>
                         <column name="is_bill" primaryKey='False'/>
                         <column name="sum" primaryKey='False'/>
                         <column name="date" primaryKey='False'/>
                     </columns>
                  </table>
               </tables>
            </grain>
         </grains>
      </ns2:responseAnyXML>
   </S:Body>
</S:Envelope>

Метод select

Возвращает список полей и их значения для заданной таблицы.

Формат входящего сообщения для xml:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:show="http://showcase.curs.ru">
   <soapenv:Header>
      <show:procName>webservices.funcTest.select.celesta</show:procName><!--Имя процедуры, которую необходимо выполнить-->
   </soapenv:Header>
   <soapenv:Body>
      <show:requestAnyXML>
           <show:requestAnyXML>
		<command 
		type="select" 
		param="" 
		sync="1" 
		system_id="testsystem" 
		pin="11111111" 
		grain="testgrain" 
		table="testtable">
                    <columns>  <!--Для запроса всех полей таблицы необходимо оставить данный тег пустым - </columns>-->
                        <column>column1</column> <!--Поле таблицы-->
                        <column>column2</column>
                        <column>column3</column>
                        <column>column4</column>
                        <column>column5</column>
                        <column>column6</column>
                    </columns>
                </command>
      </show:requestAnyXML>
   </soapenv:Body>
</soapenv:Envelope>

Формат исходящего сообщения для xml:

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
   <S:Body>
      <ns2:responseAnyXML xmlns:ns2="http://showcase.curs.ru">
         <records package_id="0abbac91-3714-4748-8285-91978f8d9bd0" system_id="testsystem"> <!--Список вернувшихся строк-->
            <rec> <!--Строка с вернувшимися значениями полей таблицы-->
               <column1>testdata1_1</column1> <!--Поле таблицы и его значение-->
               <column2>testdata2_1</column2>
               <column3>testdata3_1</column3>
               <column4>c0f0217c-1321-11e4-967b-1b332e892659</column4>
               <column5>2014-01-02 00:00:00.0</column5>
               <column6>testdata6_1</column6>
            </rec>
            <rec>
               <column1>testdata1_2</column1>
               <column2>testdata2_2</column2>
               <column3>testdata3_2</column3>
               <column4>e1ca4ea0-dcca-11e3-8d72-17f4943db54c</column4>
               <column5>2014-01-03 00:00:00.0</column5>
               <column6>testdata6_2</column6>
            </rec>
         </records>
      </ns2:responseAnyXML>
   </S:Body>
</S:Envelope>

Метод insert

Используется для добавления записей в таблицы.

Формат входящего сообщения для xml:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:show="http://showcase.curs.ru">
   <soapenv:Header>
      <show:procName>common.webservicefunc.getInsert.celesta</show:procName><!--Имя процедуры, которую необходимо выполнить-->
   </soapenv:Header>
   <soapenv:Body>
      <show:requestAnyXML>
		<command 
		type="select" 
		param="" 
		sync="1" 
		system_id="testsystem" 
		pin="1111111111" 
		grain="testgrain" 
		table="testtable">
			<records>
				<rec>
				   <column1>testdata3_1</column1>
				   <column2>testdata3_2</column2>
				   <column3>testdata3_3</column3>
				   <column4>a0f0211d-1221-11e4-967c-1b332e6790432</column4>
				   <column5>2014-01-04</column5>
				   <column6>testdata3_4</column6>
				</rec>
				<rec>
				   <column1>testdata4_1</column1>
				   <column2>testdata4_2</column2>
				   <column3>testdata4_3</column3>
				   <column4>a0f0211d-1221-11e4-967c-1b332e6790432</column4>
				   <column5>2014-01-04</column5>
				   <column6>testdata4_4</column6>
				</rec>
			</records>
		</command>
      </show:requestAnyXML>
   </soapenv:Body>
</soapenv:Envelope>

Формат исходящего сообщения для xml:

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
   <S:Body>
      <ns2:responseAnyXML xmlns:ns2="http://showcase.curs.ru">
         <result>(2 row(s) affected)</result>
      </ns2:responseAnyXML>
   </S:Body>
</S:Envelope>

Примечание: при попытке вставить запись с уже существующим первичным ключом происходит обновление аналогичное getUpdate.

Метод delete

Используется для удаления записей из таблиц.

Формат входящего сообщения для xml:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:show="http://showcase.curs.ru">
   <soapenv:Header>
      <show:procName>common.webservicefunc.getDelete.celesta</show:procName><!--Имя процедуры, которую необходимо выполнить-->
   </soapenv:Header>
   <soapenv:Body>
      <show:requestAnyXML>
                <command 
		type="delete" 
		param="column1='testdata1_1' and column2='testdata2_1'" 
		sync="1" 
		system_id="testsystem" 
		pin="1111111111" 
		grain="testgrain" 
		table="testtable"/>
      </show:requestAnyXML>
   </soapenv:Body>
</soapenv:Envelope>

Формат исходящего сообщения для xml аналогичен исходящему сообщению для метода insert.

Используется для модификации записей в таблицах.

Метод update

Возвращает список гранул и таблиц.

Формат входящего сообщения для xml:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:show="http://showcase.curs.ru">
   <soapenv:Header>
      <show:procName>common.webservicefunc.getUpdate.celesta</show:procName>
   </soapenv:Header>
   <soapenv:Body>
      <show:requestAnyXML>
        <command 
        type="delete" 
	param="column1='testdata1_1' and column2='testdata2_1'" 
	sync="1" 
	system_id="testsystem" 
	pin="1111111111" 
	grain="testgrain" 
	table="testtable">
               <update>
                   <column6>123456</column6> <!--Поле таблицы и его новое значение-->
                   <column3>testdata123456</column3>
               </update>
        </command>
      </show:requestAnyXML>
   </soapenv:Body>
</soapenv:Envelope>

Формат исходящего сообщения для xml аналогичен исходящему сообщению для метода insert.

Подсистема событий (в настоящий момент в плане развития)

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

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

Подсистема поддерживает следующие методы:

  1. Подписаться
    • На входе: код справочника, адрес веб-службы, наименование обработчика
  2. Отменить подписку
    • На входе: код справочника

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

Примерный формат сообщения -- следующий:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:show="http://showcase.curs.ru">
   <soapenv:Header>
      <show:procName>nsiChanges</show:procName><!--Наименование обработчика передается при подписке-->
   </soapenv:Header>
   <soapenv:Body>
      <show:requestAnylang>
         <changedNsiObject>
              contract
         </changedNsiObject>
      </show:requestAnylang>
   </soapenv:Body>
</soapenv:Envelope>