Описание работы сервисов

Для работы с сервисами через REST API со стороны SAP необходимо выполнять http-запросы. Для этого SAP предусмотрел стандартные ФМ HTTP_GET или HTTP2_GET (Get-запрос) и HTTP_POST или HTTP2_POST (Post-запрос), а также множество классов.

В решении TerraLink используются два стандартных модуля HTTP2_GET и HTTP2_POST для работы с REST сервисом для ИМ.

Реализован глобальный класс /TRL/XDE_CL_REST. Класс не имеет метода-конструктора, все его методы являются статическими.

Таблица 231 Описание атрибутов класса

Имя атрибута

Тип

Видимость

Технический тип

Описание

MC_USERNAME

Конст.

Private

CHAR9

Часть тела запроса для получения токена

„username=“

MC_PASSWORD

Конст.

Private

CHAR10

Часть тела запроса для получения токена

„&password=“

MC_GRANTTYPE

Конст.

Private

CHAR20

Часть тела запроса для получения токена

„&grant_type=password“

MC_AUTHORIZATION

Конст.

Private

CHAR30

Начало заголовка запроса

„authorization:bearer“

MC_REST_ARCH

Конст.

Private

/TRL/XDE_ED_REST_ID

Идентификатор rest сервиса архива

„REST_IM“

MC_REST_IM

Конст.

Private

/TRL/XDE_ED_REST_ID

Имя идентификатора сервиса

„REST_IM“

MC_PATH_TOKEN

Конст.

Private

CHAR10

Часть адреса для получения токена

„Token“

MS_REST_SV

Статич. аттрибут

Private

/TRL/XDE_REST_SV

Данные из таблицы сервисов

MS_REST_ST

Статич. аттрибут

Private

/TRL/XDE_REST_ST

Данные из таблицы операций

MC_SLASH

Конст.

Private

CHAR1

Знак слэш

„/“

MC_ENCODING

Конст.

Private

/TRL/XDE_ED_SETTING_NAME

Имя настройки

„XML_ENCODING_FTS“

MC_401

Конст.

Private

CHAR4

Код ошибки проваленной аутентифи кации

„401“

MC_200

Конст.

Private

CHAR4

Успешный код запроса

„200“

MC_403

Конст.

Private

CHAR4

Код ошибки проваленной аутентификации

„403“

MC_CONT_TYPE

Конст.

Private

BCS_AD_STR

Content-type в заголовке запроса

„content-type:

application/json“

MC_GET

Конст.

Private

/TRL/XDE_ED_HTTPTYPE

Тип HTTP запроса

„GET“

MC_POST

Конст.

Private

/TRL/XDE_ED_HTTPTYPE

Тип HTTP запроса

„POST“

MC_FIGLEFT

Конст.

Private

CHAR1

Левая фигур- ная скобка

„{„

MC_FIGRIGHT

Конст.

Private

CHAR1

Правая фигур- ная скобка

„}“

MC_GCIN

Конст.

Private

TEXT5

Коды компонен- тов типа

„gCIN“

MO_LOGGER

Статич атрибут

Private

/TRL/XDE_IF_LOGGER

Объект для логирования

Описание методов класса:

  1. GET_REST_SV

Таблица 232 GET_REST_SV

Имя метода

Вид метода

Видимость

Описание

GET_REST_SV

Static Method

Private

Получить данные из таблиц REST сервисов и операций

Таблица 233 Параметры метода

Имя параметра

Вид

Ссылочный тип

Описание

IV_OPERATION

Importing

CHAR100

Код операции

IV_ID

Importing

/TRL/XDE_ED_REST_ID

Тип REST сервиса

Метод содержит две операции выбора данных из таблиц базы данных. Первая операция - выбор данных из таблицы настроек REST сервисов /TRL/XDE_REST_SV. Найденные данные записываются в статический атрибут MS_REST_SV. Вторая операция - выбор данных по операции из таблицы настроек операции /TRL/XDE_REST_ST. Найденные данные записываются в статический атрибут MS_REST_ST.

  1. GET_HEADER

Таблица 234 GET_HEADER

Имя метода

Вид метода

Видимость

Описание

GET_HEADER

Static Method

Private

Собрать заголовок запроса

Таблица 235 Параметры метода

Имя параметра

Вид

Ссылочный тип

Описание

ET_REQUEST_HEAD

Exporting

/TRL/XDE_T_REQUEST_HEAD

Таблица заголов- ка для http-зап- роса

В данном методе происходит конкатенация константы MC_AUTHORIZATION и значения токена из атрибута MS_REST_SV-TOKEN и добавление данной записи в таблицу с заголовками. Также в таблицу с заголовками в данном методе добавляется значение константы MC_CONT_TYPE.

  1. SAVE_DATABASE

Таблица 236 SAVE_DATABASE

Имя метода

Вид метода

Видимость

Описание

SAVE_DATABASE

Static Method

Private

Сохранить токен в БД

Метод не имеет параметров. Берется токен из атрибута MS_REST_SV-TOKEN и выполняется UPDATE таблицы БД /TRL/XDE_REST_SV по ключу REST_ID. Обновляется только значение токена.

  1. GET_URI

Таблица 237 GET_URI

Имя метода

Вид метода

Видимость

Описание

GET_URI

Static Method

Private

Собрать URL адрес для вы- полнения запроса

Таблица 238 Параметры метода

Имя параметра

Вид

Ссылочный тип

Описание

I_INPUT

Importing

ANY

Данные в любой форме

ES_RETURN

Exporting

/TRL/XDE_RETURN

Код и текст сообщения

EV_URI

Exporting

STRING

URL для выполнения запроса

Проверяется заполненность данных в MS_REST_SV-PATH - если данных нет, то вызывается особая ситуация SETTINGS_ERROR. Проверяется заполненность данных в MS_REST_ST - если данных нет, то вызывается особая ситуация SETTINGS_ERROR. Далее выполняется конкатенация данных из MS_REST_SV-PATH и MS_REST_ST-METH_NAME. После этого, если удается, значение из I_INPUT динамически подставляется на место имени метода, если такое было предусмотрено.

  1. GET_TOKEN

Таблица 239 GET_TOKEN

Имя метода

Вид метода

Видимость

Описание

GET_TOKEN

Static Method

Public

Получить токен из БД или ИМ по rest api

Таблица 240 Параметры метода

Имя параметра

Вид

Ссылочный тип

Описание

ES_RETURN

Exporting

/TRL/XDE_RETURN

Код и текст сообщения

В первую очередь проверяется заполненность токена в MS_REST_SV-TOKEN. Если токен найден – работа метода заканчивается, в противном случае – выполняется получение нового токена. Для этого значение из атрибута MS_REST_SV-PATH объединяется в строку для URL для выполнения http-запроса. Другие атрибуты MS_REST_SV-USERNAME и MS_REST_ST-PASSWORD используются для обарзования заголовка для прохождения аутентификации в REST сервисе. Данная строка является телом запроса для получения токена.

Содержимое строки (тело запроса) = «username=1&password=2&grant_type=password», где 1 = содержимое MS_REST_SV-USERNAME, 2 = содержимое MS_REST_SV-PASSWORD.

Содержимое адреса = «1Token», где 1 = содержимое MS_REST_SV-PATH.

  • Если при преобразовании возникли ошибки – работа метода заканчивается, а структура ES_RETURN будет содержать CODE = 2210 и TEXT = «Не удалось получить токен для авторизации».

Затем выполняется вызов ФМ HTTP2_POST, на вход которого подается сформированный адрес запроса и тело запроса.

  • Если ФМ отрабатывает неуспешно (sy-subrc не равен 0) – заполняется поле ES_RETURN-CODE = 2210 и ES_RETURN-TEXT = «Не удалось получить токен для авторизации».

Далее, с помощью метода GET_SETTING_SAFE класса /TRL/XDE_CL_SETTINGS достаем данные из настройки «XML_ENCODING_FTS» (атрибут MC_ENCODING)

../../_images/image83.png

Далее, с помощью ФМ SCP_CODEPAGE_BY_EXTERNAL_NAME, получаем кодировку

  • Если результат работы ФМ не успешен (sy-subrc не равен 0) – заполняем поля ES_RETURN-CODE = 9999 и ES_RETURN-TEXT = «Не найден номер кодировки для конвертации данных запроса». Работа метода на этом заканчивается.

Конвертируем тело ответа от http-запроса с указанием найденной кодировки в строку. Для этого используем метод HTMLBIN_TO_HTMLTXT класса CL_BCS_CONVERT. И делаем попытку распарсить полученную строку с помощью вызова Simple Transformation /TRL/XDE_XSLT_IN_TOKEN.

  • Если во время трансформации возникли ошибки, приведшие к вызову особой ситуации, заполняются поля ES_RETURN-CODE = 9999 и ES_RETURN-TEXT = «Не удалось получить токен для авторизации»

Атрибуту MS_REST_SV-TOKEN присваиваем полученный токен и затем вызываем метод save_database и завершаем работу метода.

  1. DO_OPERATION

Таблица 241 DO_OPERATION

Имя метода

Вид метода

Видимость

Описание

DO_OPERATION

Static Method

Public

Выполнить операцию

Таблица 242 Параметры метода

Имя параметра

Вид

Ссылочный тип

Описание

IV_OPERATION

Importing

CHAR100

Имя операции

I_INPUT

Importing

ANY

Данные в любом виде

E_OUTPUT

Exporting

ANY

Данные в любом виде

ES_RETURN

Exporting

/TRL/XDE_RETURN

Код и текст сообщения

Данный метод является универсальным методом для работы с REST сервисом интеграционного модуля. Сначала вызывается метод GET_REST_SV, который заполняет нужные статические атрибуты класса. Далее выполняется MS_REST_SV-ITERATOR раз попытки выполнить запрос с ожиданиями между итерациями равными /TRL/XDE_REST_SV-WAIT секунд. Это сделано так как некоторые запросы только ставят задачу на выполнение, а результат получается по идентификатору данной задачи. Бывает так, что для получения результата необходимо подождать какое-то количество времени. С помощью вышеописанных настроек из атрибута MS_REST_SV можно задать максимальное время ожидания для таких задач. Каждая итерация состоит из двух выполнений определенного алгоритма. Выполнение дважды необходимо, так как если окажется, что имеющийся в БД токен, уже неактуален, то во время выполнения второго раза токен будет запрошен через REST сервис в обязательном порядке. Алгоритм для выполнения операции же состоит из следующих шагов: Получение токена через метод GET_TOKEN. Получние URL для выполнения http-запроса с помощью метода GET_URI. Получение тела запроса в бинарном виде с помощью ФМ, указанного в настройках и хранящегося в MS_REST_ST-CREATE_BODY. Получение заголовочной части http-запроса с помощью метода GET_HEADER. Выполнение http-запроса с помощью метода DO_REQUEST. Обработка полученного результата с помощью ФМ, указанного в настройках и хранящегося в MS_REST_ST-INPUT_FM.

  1. DO_REQUEST

Таблица 243 DO_REQUEST

Имя метода

Вид метода

Видимость

Описание

DO_REQUEST

Static Method

Private

Выполнить http запрос

Таблица 244 Параметры метода

Имя параметра

Вид

Ссылочный тип

Описание

IV_URI

Importing

STRING

Адрес запроса

IV_REQ_SIZE

Importing

I (Integer)

Размер тела запроса

IT_REQ_BODY

Importing

SOLIX_TAB

Тело запроса

IT_REQ_HEAD

Importing

/TRL/XDE_T_REQUEST_HEAD

Таблица заголовков сообщения

ES_RETURN

Exporting

/TRL/XDE_RETURN

Код и текст сообщения

EV_SIZE

Exporting

I (Integer)

Размер тела ответа

ET_RESP_BODY

Exporting

SOLIX_TAB

Тело ответа в бинарном виде

В зависимости от того, какой тип запроса настроен для операции в MS_REST_ST-HTTP_TYPE вызывается либо стандартный ФМ HTTP2_GET, либо HTTP2_POST. Если код sy-subrc не будет равен 0 - будет вызвана особая ситуация HTTP_ERROR. Если же запрос будет выполнен, но вернется код 401 или 403 - будет вызвана особая ситуация AUTH_ERROR и будет очищено значение токена из MS_REST_SV-TOKEN. Если вернется код отличный от 200 - произошла какая-то ошибка. Вызывается особая ситуация HTTP_ERROR. Если вернется код 200, значит, что всё в порядке.