Описание

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

Но использовать один лишь класс сервиса может быть корректно только в том случае, когда и на входе, и на выходе нам нужно только по одной переменной. Если же на вход метода сервиса подается несколько переменных, то более удобно; а если на выходе метода нужно получить более одной переменной, то единственно возможно, использовать классы контрактов. Эти классы содержат в себе перечень переменных, которые будут приниматься на входе метода или отправляться на выход вместе.

Кроме создания этих классов также нужно создать файлы сервисов, соответствующие созданным классам сервисов, и файлы сервисных групп, объединяющие файлы сервисов, и дающие к ним доступ из клиентского приложения. Доступ дается в виде двух URL ссылок – одна из которых указывает на документ XML, используемый форматом SOAP, а другая на строку JSON, для использования форматом JSON. То есть, веб-сервис D365O разворачивается сразу в двух форматах.

Создание класса контракта

  • 1. Создаем класс с атрибутом [DataContractAttribute].

  • 2. Объявляем переменные, которые в дальнейшем будут вместе поступать на вход или на выход метода сервиса.

  • 3. Для каждой из переменных создаем parm-метод с атрибутом [DataMemberAttribute(««НАЗВАНИЕ ПЕРЕМЕННОЙ»»)]. Под названием переменной имеется в виду имя переменной при обращении к ней на клиентской стороне.

  • 4. Если переменная должна содержать коллекцию вложенных контрактов, то нужно также добавить аттрибут AifCollectionTypeAttribute(“«НАЗВАНИЕ КОЛЛЕКЦИИ»”, Types::Class, classStr(«НАЗВАНИЕ КЛАССА КОНТРАКТА»))], а в качестве возвращаемого типа выбрать List. Если контракт используется как результат, то название коллекции вложенных контрактов должно быть return.

В качестве примера приведен элемент контракта с одной обычной переменной и одной коллекцией вложенных контрактов:

Copy to Clipboard

Создание класса сервиса

  • 1. Создаем обычный класс.

  • 2. Если входные переменные или возвращаемое значение представляют собой массив данных, то, по умолчанию, на стороне клиента они будут восприниматься как тип List, который не всегда работает одинаково в разных языках программирования. Поэтому хорошей практикой считается превращение типов этих переменных в обыкновенные массивы. Делается это с помощью добавления к методам аттрибутов AifCollectionTypeAttribute(“«НАЗВАНИЕ ПЕРЕМЕННОЙ»”, Types:: «ТИП МАССИВА»). При этом в кавычках, в качестве названия переменной, может быть указан return для возвращаемого значения, или название одной из входных переменных метода. В качестве типа массива может быть выбран любой примитивный тип (например, Types::String), или же класс контракта. При указании класса контракта, синтаксис немного изменяется: AifCollectionTypeAttribute(“«НАЗВАНИЕ ПЕРЕМЕННОЙ»”, Types::Class, classStr(«НАЗВАНИЕ КЛАССА КОНТРАКТА»))].

Также он дает возможность добавить аттрибут [DataMember] к их переменным, с опциональным аргументом Name. Например:

Copy to Clipboard

В приведенном примере, в качестве возвращаемого результата со стороны клиента будет массив строк (String[]), а в качестве входной переменной будет приниматься массив классов контрактов (InventoryServiceContract[]). Но при этом в коде D365O, все эти переменные будут рассматриваться и обрабатываться в качестве List, то есть с использованием ListEnumerator для считывания входных данных и метода addEnd() для записи в результирующую переменную.

Кроме того, стоит отметить строку changecompany(“USMF”). При работе с SOAP веб-сервисами, программист со стороны клиента может выбрать нужную ему компанию вызывая веб-сервис, с помощью установки значения в специальную переменную контекста, передаваемую в любой SOAP веб-сервис D365O вместе с входными и выходными переменными. В случае же с JSON веб-сервисами, сменить компанию со стороны клиента по умолчанию невозможно, поэтому нужно учитывать этот момент при написании кода веб-сервиса.

Примеры классов сервиса и контракта

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

Copy to Clipboard

Создание файлов сервисов и сервисных групп

  • 1. Создать файл типа Service.

Нажать правой кнопкой на выпадающий список References и выбрать Add Service Reference....
  • 2. Открыть созданый файл и прописать в нем Class и ExternalName. Поле Class должно содержать название созданого ранее класса сервиса. ExternalName можно выбрать любое, — это имя будет видно клиентским приложениям.

Нажать правой кнопкой на выпадающий список References и выбрать Add Service Reference....
  • 3. Нажать правой кнопкой мыши на выпадающем списке Service Operations и выбрать New Service Operation. Выбрав созданую операцию, в ее настройках нужно указать Method и Name. Method должен содержать название одного из методов указаного реннее класса сервиса.

Нажать правой кнопкой на выпадающий список References и выбрать Add Service Reference....
  • 4. Создать файл типа Service Group.

Нажать правой кнопкой на выпадающий список References и выбрать Add Service Reference....
  • 5. В созданный файл мышкой перетянуть созданый ранее файл сервиса, или же нажать правой кнопкой мыши на название группы и выбрать в выпадающем списке New Service. Для добавленного в группу сервиса прописать Name и Service, где Service – это название файла сервиса.

Нажать правой кнопкой на выпадающий список References и выбрать Add Service Reference....
  • 6. Собрать проект.

  • 7. Проверить доступность сервисной группы по ссылке вида https://«ИМЯ ХОСТА»/soap/Services/«НАЗВАНИЕ СЕРВИСНОЙ ГРУППЫ»/?wsdl. Должен выдаться XML документ. Например:

https://oit-adm-boryseda2b5401719f08ddevaos.cloudax.dynamics.com/soap/services/InventJourMovementGeneratorServiceGroup?wsdl

При этом, успешная проверка по ссылке выше, соответствующая адресу SOAP веб-сервиса, также значит и успешное развертывание JSON веб-сервиса, который всегда разворачивается одновременно. JSON веб-сервис доступен по ссылке вида https://«ИМЯ ХОСТА»/api/services/«НАЗВАНИЕ СЕРВИСНОЙ ГРУППЫ»/«НАЗВАНИЕ СЕРВИСА»/«НАЗВАНИЕ МЕТОДА СЕРВИСА». Например:

https://oit-adm-boryseda2b5401719f08ddevaos.cloudax.dynamics.com/api/services/InventJourMovementGeneratorServiceGroup/InventJourMovementGeneratorService/createInventJournal

Подготовил статью:

Дыкуха
ДыкухаБорис Александрович
Senior Software Developer, OntargIT
Published On: 21 апреля, 2021 / Рубрики: Technical Support /

Следите за новостями компании OntargIT

    Ознакомиться с Политикой конфиденицальности можно здесь.