See sap note 1797736 for error analysis

Function import – Операция выполняемая на стороне бэкенд системы. Это некоторая альтернатива обычным CRUD сервисам для случаев не подходящих под GET, POST, PUT, DELETE запросы. Может быть вызвана GET и POST методами. Например, проверки, запуски каких либо операций и прочее. Пример создания Для сервиса созданного в прошлой части создадим Function import по проверке наличия записи … Читать далее «Создание oData сервиса. Часть 2. Function import»

Function import – Операция выполняемая на стороне бэкенд системы. Это некоторая альтернатива обычным CRUD сервисам для случаев не подходящих под GET, POST, PUT, DELETE запросы. Может быть вызвана GET и POST методами. Например, проверки, запуски каких либо операций и прочее.

Пример создания

Для сервиса созданного в прошлой части создадим Function import по проверке наличия записи в таблице. (Максимально примитивная функция, в реальных задачах будете вызывать что-то реально стоящее))

Новая функция будет получать на вход ключ записи в таблице
SPFLI и возвращать информацию о ее наличииотсутствии.
Первым делом следует создать выходную сущность:

В прошлый раз мы создавали сущность на основе данных из ABAP словаря. В этот раз для разнообразия создадим свойства вручную.

Создание функции

Первая функция будет использовать метод GET и возвращать только одну запись

Далее указываем входные параметры функции (Function Import Parameters). Точно таким же способом как и для сущности.
Выходные параметры имеют три варианта:
Без выходных параметров – тут, думаю, все ясно.
Entity type – можно использовать обычные entity или EntitySet в зависимости от кардинальности.
Complex Type – Это отдельная сущность, пример с которой будет рассмотрен ниже.

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

Для обработки вызова необходимо переопределить метод EXECUTE~ACTION класса DPC_EXT

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

METHOD /iwbep/if_mgw_appl_srv_runtime~execute_action.

    «Обратите внимание откуда можно взять выходной тип

    DATA ls_data TYPE zcl_zz_test_service_mpc=>ts_entityfcheck.

    CASE iv_action_name.

      WHEN ‘runFunctionCheck’ .

        DATA(lv_carrid) = it_parameter[ name = ‘Carrid’ ]value.

        DATA(lv_connid) = it_parameter[ name = ‘Connid’ ]value.

        ls_datacarrid = lv_carrid.

        ls_dataconnid = lv_connid.

        SELECT SINGLE * FROM spfli INTO @DATA(ls_spfli) WHERE connid = @lv_connid

                                                          AND carrid = @lv_carrid.

        IF sysubrc = 0.

          ls_datastatus = abap_true.

        ENDIF.

        copy_data_to_ref( EXPORTING is_data = ls_data

                           CHANGING  cr_data = er_data

                          ).

      WHEN OTHERS.

    ENDCASE.

ENDMETHOD

Тест осуществляется в транзакции /IWFND/GW_CLIENT
Строка для запуска sap/opu/odata/sap/ZZ_TEST_SERVICE_SRV/runFunctionCheckPost?Connid=’0017’&Carrid=’AA’
Результат:

Далее сделаем POST функцию для того же самого действия. Собственно ничем не будет отличаться, кроме метода вызова.

В коде укажем, что новая функция должна идти по той же ветке, что и прошлая(Напоминаю, это чтобы сильно не мудрить с кучей кода)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

METHOD /iwbep/if_mgw_appl_srv_runtime~execute_action.

    «Обратите внимание откуда можно взять выходной тип

    DATA ls_data TYPE zcl_zz_test_service_mpc=>ts_entityfcheck.

    CASE iv_action_name.

      WHEN ‘runFunctionCheck’ OR ‘runFunctionCheckPost’.

        DATA(lv_carrid) = it_parameter[ name = ‘Carrid’ ]value.

        DATA(lv_connid) = it_parameter[ name = ‘Connid’ ]value.

        ls_datacarrid = lv_carrid.

        ls_dataconnid = lv_connid.

        SELECT SINGLE * FROM spfli INTO @DATA(ls_spfli) WHERE connid = @lv_connid

                                                          AND carrid = @lv_carrid.

        IF sysubrc = 0.

          ls_datastatus = abap_true.

        ENDIF.

        copy_data_to_ref( EXPORTING is_data = ls_data

                           CHANGING  cr_data = er_data

                          ).

      WHEN OTHERS.

    ENDCASE.

ENDMETHOD.

Параметры при запуске передаем точно так же.
sap/opu/odata/sap/ZZ_TEST_SERVICE_SRV/runFunctionCheckPost?Connid=’0017’&Carrid=’AA’

Третий ФМ будет немного отличаться. На вход подаем поле Carrid а на выходе хотим получить список значений из таблицы с этим полем. При При этом нам надо задать кардинальность 0..n или 1..n. И, что казалось бы логичным установить выходные параметры как EntitySet.
Что-то вроде этого:

Однако, при попытке вызова ФМ получим 405 ошибку: The specified HTTP method is not allowed for the resource identified by the Data Service Request URI

<?xml version=«1.0» encoding=«UTF-8»?>

<error xmlns=«http://schemas.microsoft.com/ado/2007/08/dataservices/metadata»>

<code>005056A509B11ED199D8826D151FC0FE</code>

<message xml:lang=«ru»>The specified HTTP method is not allowed for the resource identified by the Data Service Request URI</message>

<innererror xmlns=«http://schemas.microsoft.com/ado/2007/08/dataservices/metadata»>

<transactionid>436D52A3C6FF0100E00624BBEE2DDE75</transactionid>

<timestamp>20220422103601.6907860</timestamp>

<Error_Resolution>

<SAP_Transaction>Run transaction /IWFND/ERROR_LOG on SAP Gateway hub system and search for entries with the timestamp above for more details</SAP_Transaction>

<SAP_Note>See SAP Note 1797736 for error analysis (https://service.sap.com/sap/support/notes/1797736)</SAP_Note>

</Error_Resolution>

</innererror>

</error>

Это можно обойти указав тип выходного параметра как Complex Type

Создание Complex Type:

Добавляем выходные поля. Хватит и двух для примера.

Указываем этот тип в настройке новой функции:

Реализуем ветку для сбора данных в методе EXECUTE_ACTION

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

  METHOD /iwbep/if_mgw_appl_srv_runtime~execute_action.

    «Обратите внимание откуда можно взять выходной тип

    DATA ls_data TYPE zcl_zz_test_service_mpc=>ts_entityfcheck.

    CASE iv_action_name.

      WHEN ‘runFunctionCheck’ OR ‘runFunctionCheckPost’.

        DATA(lv_carrid) = it_parameter[ name = ‘Carrid’ ]value.

        DATA(lv_connid) = it_parameter[ name = ‘Connid’ ]value.

        ls_datacarrid = lv_carrid.

        ls_dataconnid = lv_connid.

        SELECT SINGLE * FROM spfli INTO @DATA(ls_spfli) WHERE connid = @lv_connid

                                                          AND carrid = @lv_carrid.

        IF sysubrc = 0.

          ls_datastatus = abap_true.

        ENDIF.

        copy_data_to_ref( EXPORTING is_data = ls_data

                           CHANGING  cr_data = er_data

                          ).

      WHEN ‘runFunctionCheckPostMany’.

        DATA lt_data_many TYPE TABLE OF zcl_zz_test_service_mpc=>typeexitmany.

        DATA(lv_carrid_m) = it_parameter[ name = ‘Carrid’ ]value.

        SELECT  * FROM spfli INTO CORRESPONDING FIELDS OF TABLE @lt_data_many WHERE carrid = @lv_carrid_m.

        copy_data_to_ref( EXPORTING is_data = lt_data_many

                           CHANGING  cr_data = er_data

                  ).

      WHEN OTHERS.

    ENDCASE.

ENDMETHOD.

Я следую руководству по OData на https://blogs.sap.com/2017/05/21/step-4-with-sap-s4hana-cloud-sdk-calling-an-odata-service/comment-page-1/ и получаю сообщение об ошибке, когда пытаюсь найти деловых партнеров с помощью DefaultBusinessPartnerService.

Соответствующий фрагмент кода:

        DefaultBusinessPartnerService businessPartnerService = new DefaultBusinessPartnerService();
        System.err.println("criated default business partner");

        List<BusinessPartner> partners = businessPartnerService
                .getAllBusinessPartner()
                .select(BusinessPartner.BUSINESS_PARTNER,
                        BusinessPartner.LAST_NAME,
                        BusinessPartner.FIRST_NAME)
                //.filter(BusinessPartner.BUSINESS_PARTNER_CATEGORY.eq(CATEGORY_VENDOR))
                .orderBy(BusinessPartner.LAST_NAME, Order.ASC)
                .execute(new ErpEndpoint(new ErpConfigContext()));

        response.setContentType("application/json");
        response.getWriter().write(new Gson().toJson(partners));

Моя конфигурация ErpQueryEndpoint выглядит следующим образом:

#Mon May 14 15:27:09 BRT 2018
URL=https://host:port
Name=ErpQueryEndpoint
TrustAll=TRUE
Type=HTTP
Password=Password
Authentication=BasicAuthentication
User=Username

Где host, port, Username и Password были заменены правильными значениями.

Когда я запрашиваю http://localhost:8080/s4integration-application/businesspartners, я получаю следующую ошибку:

The endpoint responded with HTTP error code 403.
No service found for namespace , name API_BUSINESS_PARTNER, version 0001
Full error message: 
{
  "error": {
    "code": "/IWFND/MED/170",
    "message": {
      "lang": "en",
      "value": "No service found for namespace , name API_BUSINESS_PARTNER, version 0001"
    },
    "innererror": {
      "application": {
        "component_id": "",
        "service_namespace": "/SAP/",
        "service_id": "API_BUSINESS_PARTNER",
        "service_version": "0001"
      },
      "transactionid": "C83CB3D2A1420000E005AF97B0836AD5",
      "timestamp": "20180514182746.3576100",
      "Error_Resolution": {
        "SAP_Transaction": "Run transaction /IWFND/ERROR_LOG on SAP Gateway hub system (System Alias ) and search for entries with the timestamp above for more details",
        "SAP_Note": "See SAP Note 1797736 for error analysis (https://service.sap.com/sap/support/notes/1797736)"
      },
      "errordetails": []
    }
  }
}

Кажется, что конечная точка не настроена в системе SAP (это система S / 4 Hana). Я не уверен, нужно ли мне добавить что-то еще к URL, кроме хоста и порта, или есть какая-то другая конфигурация, которая должна быть выполнена в системе SAP.

В настоящее время я использую версию SDK 3.39.0 и версию 0004 определения службы API_MKT_CONTACT для создания нового контакта в Marketing Cloud со следующим кодом:

ContactOriginData contact =
        ContactOriginData.builder()
            .originOfContact(origin)
            .originTimestamp(ZonedDateTime.now())
            .externalContactID(pii.getId().toString())
            .firstName(pii.getFirstName())
            .lastName(pii.getLastName())
            .language(pii.getLanguage())
            .countryReg(pii.getRegion())
            .build();

// use low level API as a work around for https://github.com/SAP/cloud-sdk/issues/156
ODataRequestUpdate contactRequest = service
          .updateContactOriginData(contact)
          .withHeader("Sap-Cuan-RequestTimestamp", getFormattedTime(System.currentTimeMillis()))
          .withHeader("Sap-Cuan-SequenceId", "UpdatePatch")
          .withHeader("Sap-Cuan-SourceSystemType", "EXT")
          .withHeader("Sap-Cuan-SourceSystemId", "sdk-test")
          .toRequest();

String servicePath = "/sap/opu/odata/SAP/API_MKT_CONTACT_SRV;v=0004";
ODataRequestBatch requestBatch =  new ODataRequestBatch(servicePath, ODataProtocol.V2);
requestBatch.beginChangeset().addUpdate(contactRequest).endChangeset();
HttpClient httpClient = HttpClientAccessor.getHttpClient(destination);
ODataRequestResultMultipartGeneric batchResult = requestBatch.execute(httpClient);

Выполнение этого приводит к следующей ошибке:

{
  "error": {
    "code": "/IWFND/CM_MGW/096",
    "message": {
      "lang": "en",
      "value": "PATCH requests require components to be updated"
    },
    "innererror": {
      "application": {
        "component_id": "CEC-MKT-DM-IC",
        "service_namespace": "/SAP/",
        "service_id": "API_MKT_CONTACT_SRV",
        "service_version": "0004"
      },
      "transactionid": "3B63A2A6CC920630E0060492A51E7EE7",
      "timestamp": "20210310210334.4378960",
      "Error_Resolution": {
        "SAP_Transaction": "For backend administrators: use ADT feed reader "SAP Gateway Error Log" or run transaction /IWFND/ERROR_LOG on SAP Gateway hub system and search for entries with the timestamp above for more details",
        "SAP_Note": "See SAP Note 1797736 for error analysis (https://service.sap.com/sap/support/notes/1797736)",
        "Batch_SAP_Note": "See SAP Note 1869434 for details about working with $batch (https://service.sap.com/sap/support/notes/1869434)"
      },
      "errordetails": []
    }
  }
}

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

Request Payload:

--batch
Content-Type: multipart/mixed; boundary=changeset

--changeset
Content-Type: application/http
Content-Transfer-Encoding: binary

PATCH ContactOriginData(ContactOrigin='<ContactOrigin>',ContactID='24D8F7F6-440D-44F8-A24B-552435477688') HTTP/1.1
Accept: application/json
Content-Type: application/json
Content-Length: 172
Sap-Cuan-RequestTimestamp: '2021-03-10T14:07:00.000'
Sap-Cuan-SequenceId: UpdatePatch
Sap-Cuan-SourceSystemType: EXT
Sap-Cuan-SourceSystemId: postman-test

{"OriginDataLastChgUTCDateTime":"/Date(1615410479885)/","EmailAddress":"samantha.cook@theoasis.com","FirstName":"Samantha","LastName":"Cook","Country":"US","Language":"EN"}

--changeset--
--batch--

Response Payload:

--1D7E85E6BC66B34E61ACF0EF3964CBD90
Content-Type: multipart/mixed; boundary=1D7E85E6BC66B34E61ACF0EF3964CBD91
Content-Length:       430

--1D7E85E6BC66B34E61ACF0EF3964CBD91
Content-Type: application/http
Content-Length: 262
content-transfer-encoding: binary

HTTP/1.1 204 No Content
Content-Length: 0
dataserviceversion: 2.0
sap-message: {"code":"HPA_STAGING_AREA/037","message":"Payload is processed via staging area. See Import Monitor for details.","target":"","severity":"info","transition":false,"details":[]}


--1D7E85E6BC66B34E61ACF0EF3964CBD91--

--1D7E85E6BC66B34E61ACF0EF3964CBD90--

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

Inline component is not defined or not allowed (HTTP PUT)

Что-то в SDK мне не хватает или я использую неправильно? Любая помощь будет оценена по достоинству!

Ура!

1 ответ

Лучший ответ

Чтобы обновить объект, вы должны сначала получить его из службы. Это независимо от того, используете ли вы:

  1. PATCH, который обновит только измененные поля
  2. или PUT, который отправит полный объект сущности

В настоящее время вы создаете новый объект сущности через построитель: ContactOriginData.builder(). Вместо этого используйте соответствующий метод getContactOriginDataByKey() вашей службы, чтобы сначала получить объект для обновления из службы. На самом деле многие службы заставят вас сделать это, чтобы вы всегда редактировали последнюю версию своих данных. Это часто происходит через ETags, которые SDK также обработает автоматически.

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


Редактировать: Как вы указали в комментариях, фактическая цель состоит в том, чтобы создать объект, а конкретная рассматриваемая служба позволяет создавать объекты только PUT и PATCH .

В этом случае использование replacingEntity() (которое переводится как PUT) уже должно работать с вашим кодом. Вы также можете заставить работать PATCH, заменив подход конструктора подходом с вызовом конструктора и установщиком.


1

MatKuhr
12 Мар 2021 в 07:37

#sap-cloud-platform #sap-cloud-sdk #sap-cloud-foundry #sap-cloud-connector

#sap-облачная платформа #sap-cloud-sdk #sap-облако-литейное производство #sap-cloud-соединитель

Вопрос:

У нас есть приложение springboot / sap-cloud-sdk (3.34.1), развернутое на SAP CloudFoundry. Наше приложение подключается к встроенному шлюзу SAP для служб OData и использует службу назначения и подключения CF. В большинстве случаев это работает нормально. Недавно мы начали использовать пакетные запросы к нашей службе SAP OData.

Локальное тестирование на шлюзе SAP показывает, что пакетные запросы обрабатываются нормально. Мы получаем правильные результаты ошибок, когда отправляем запрос, который должен завершиться ошибкой, и когда мы отправляем правильный запрос, он также обрабатывается нормально.

Однако, когда мы развертываем приложение в SAP CF и запрос направляется через службу подключения, мы всегда получаем HTTP 202 Принятый ответ. Независимо от того, что возвращает шлюз SAP. Если мы выполняем некоторую отладку и трассировку на шлюзе SAP, мы видим ожидаемые поступающие запросы, а также ожидаемые ответы от шлюза SAP.

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

введите описание изображения здесь

На рисунке выше показаны компоненты, через которые проходит запрос. Наше приложение PMD использует cloud sdk для создания пакетных запросов, определения адресата и отправки его через службу подключения на шлюз SAP. Шлюз возвращает правильный ответ, но мы никогда не видим этот ответ в нашем приложении. Вместо этого мы всегда получаем 202 принятых ответа.

— Обновление 2020-12-15 16:39 —

Мы используем OData V2. Мы провели еще несколько тестов, и это не служба подключения. Мы сосредоточились только на полезных нагрузках SAP Gateway для реагирования. Но, по-видимому, пакетные ответы всегда заключаются в 202 принятых ответа. Если мы посмотрим более внимательно, то увидим, что получаем следующий ответ:

 HTTP/1.1 202 Accepted

content-type: multipart/mixed; boundary=6C34B07793A6EA7C8AAFC5BC339BDAEC0
content-length: 709
dataserviceversion: 2.0
cache-control: no-cache, no-store, must-revalidate
sap-perf-fesrec: 1300458.000000

--6C34B07793A6EA7C8AAFC5BC339BDAEC0
Content-Type: application/http
Content-Length: 1171
content-transfer-encoding: binary

HTTP/1.1 400 Bad Request
Content-Type: application/json;charset=utf-8
Content-Length: 1050
dataserviceversion: 1.0

{"error":{"code":"ZCU/100","message":{"lang":"nl","value":"Service 0000000003 0000000010 niet gevonden voor operatie 0410"},"innererror":{"application":{"component_id":"","service_namespace":"/SAP/","service_id":"ZCU_PE_ORDER_SRV","service_version":"0001"},"transactionid":"23F2932D54040110E005FD84A23B406E","timestamp":"20201215151501.0634490","Error_Resolution":{"SAP_Transaction":"Run transaction /IWFND/ERROR_LOG on SAP Gateway hub system (System Alias ) and search for entries with the timestamp above for more details","SAP_Note":"See SAP Note 1797736 for error analysis (https://service.sap.com/sap/support/notes/1797736)","Batch_SAP_Note":"See SAP Note 1869434 for details about working with $batch (https://service.sap.com/sap/support/notes/1869434)"},"errordetails":[{"code":"ZCU/100","message":"Service 0000000003 0000000010 niet gevonden voor operatie 0410","propertyref":"","severity":"error","target":""},{"code":"/IWBEP/CX_MGW_BUSI_EXCEPTION","message":"Fout bij wijzigen PE order.","propertyref":"","severity":"error","target":""}]}}}
--6C34B07793A6EA7C8AAFC5BC339BDAEC0--
 

И каким-то образом содержимое ответа не читается должным образом SAP Cloud SDK.

В нашем коде мы отправляем 1 набор изменений с запросом. Следующие методы являются основой нашего пакетного вызова. batchUpdatePEOrderById Выполняет запрос. Другие методы являются просто помощниками для подготовки пакетного запроса.

Мы ожидали f.get(0) , что результаты первого набора изменений будут развернуты, или, по крайней мере, в нашем примере запрос приведет к Try.failure() , но это всегда приводит к Try.success()

 private Either<DomainError, ExternalId> batchUpdatePEOrderById(final ExternalId id, List<ServiceChange> serviceChanges, final String jwtToken) {
    final HttpDestination sapMatrix = httpDestinationProvider.providePrincipalPropagationDestination(jwtToken);

    // See https://sap.github.io/cloud-sdk/docs/java/features/odata/use-typed-odata-v2-client-in-sap-cloud-sdk-for-java#batch-requests
    var f = prepareBatchRequest(id, serviceChanges)
            .executeRequest(sapMatrix);
    return f.get(0).toEither()
            .bimap(error -> getDomainError(id, error), result -> {
                log.warn("Updated PE-Order {} successfully: {}", id, result.getCreatedEntities());
                return id;
            });
}

private ZCUPEORDERSRVServiceBatch prepareBatchRequest(ExternalId id, List<ServiceChange> serviceChanges) {
    var batch = peOrderService.batch();
    var changeSet = batch.beginChangeSet();
    // Split service changes and add to batch operation
    var newServices = mapServiceChanges(ChangeType.ADDED, serviceChanges, id);
    var updatedServices = mapServiceChanges(ChangeType.QUANTITY_CHANGED, serviceChanges, id);
    var deletedServices = mapServiceChanges(ChangeType.DELETED, serviceChanges, id);

    if (!newServices.isEmpty()) {
        buildServiceChangeSet(changeSet, newServices, ChangeType.ADDED);
    }

    if (!updatedServices.isEmpty()) {
        buildServiceChangeSet(changeSet, updatedServices, ChangeType.QUANTITY_CHANGED);
    }

    if (!deletedServices.isEmpty()) {
        buildServiceChangeSet(changeSet, deletedServices, ChangeType.DELETED);
    }
    return changeSet.endChangeSet();
}

private void buildServiceChangeSet(ZCUPEORDERSRVServiceBatchChangeSet changeSet, final List<Dienst> services, final ChangeType changeType) {
    switch (changeType) {
        case ADDED:
            services.forEach(changeSet::createDienst);
            break;
        case QUANTITY_CHANGED:
            services.forEach(changeSet::updateDienst);
            break;
        case DELETED:
            services.forEach(changeSet::deleteDienst);
            break;
        default:
            changeSet.endChangeSet();
    }
}
 

Есть какие-нибудь идеи, что здесь может быть не так?

Спасибо,

Дэнни

Комментарии:

1. Не могли бы вы рассказать, какой код вы используете для вызова пакетного запроса и является ли служба OData OData V2 или V4?

2. Я обновил свой вопрос дополнительной информацией.

3. И просто чтобы напомнить вам, правильно ли обрабатывается пакетный запрос SAP или нет. Кажется, что ошибка в обработке ответа в SDK

4. Глядя на код, похоже, что это ошибка в SDK. VDM просто никогда не проверяет, удалось ли выполнить отдельные запросы, а вместо этого напрямую пытается проанализировать отдельные результаты. Не могли бы вы, пожалуйста, проверить f.get(0).getCreatedEntities() , не выдает ли это ошибку?

5. @MatKuhr Я провел некоторое тестирование / отладку, используя сеанс удаленной отладки в SAP CF, установив точку останова return f.get(0).... . Нет f.get(0).getCreatedEntities , но есть только кот f.get(0).get().getCreatedEntities() . Это всегда приводит к списку из 0 записей. Также f.get(0).isSuccess() всегда true , даже если SAP отправляет ответ об ошибке в полезной нагрузке (например, в моем сообщении)

Ответ №1:

Комментарии:

1. Добавлена ссылка на примечания к выпуску SAP Cloud SDK 3.34.1 .

2. На основе sap.github.io/cloud-sdk/docs/java /… новая версия 3.36.0 должна была быть выпущена 4 дня назад. Однако он недоступен в maven central. Когда это будет доступно?

3. Теперь он доступен. Произошла необычная задержка при доставке библиотек в Maven Central.

Понравилась статья? Поделить с друзьями:
  • Sedo gateway api soap sedogateway сервера https sedo fss ru произошла ошибка
  • Sending error report over smapi is disabled negative priority skipping варфейс
  • Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium
  • Sending error report over smapi is disabled negative priority skipping warface
  • Sed re error illegal byte sequence