Можете ли вы вернуть конкретные ошибки из службы шлюза SAP?

У нас есть сторонняя организация, которая размещает заказы в нашей системе через полезную нагрузку JSON в сервисе шлюза SAP.

Структура службы шлюза содержит структуру данных, ожидаемых в JSON.

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

У нас есть определенный уровень обработки ошибок на стороне ABAP, но если есть ЛЮБАЯ проблема с форматом JSON, общая ошибка 500 возвращается непосредственно из SAP Gateway, даже не попадая в ABAP.

Возникает вопрос: есть ли способ вернуть конечному пользователю конкретную ошибку JSON?


person Adam Harkus    schedule 15.06.2020    source источник
comment
Нет, насколько я знаю, вы не можете вернуть такую ​​ошибку   -  person Haojie    schedule 17.06.2020


Ответы (1)


Во-первых, основной журнал GW находится в /IWFND/ERROR_LOG tcode. Он содержит как системные, так и пользовательские ошибки шлюза и выглядит так:

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

Общий подход к ведению журнала ошибок в SAP Gateway:

  1. Поместите свое собственное сообщение об ошибке и вызовите бизнес-исключение в методе проверки параметров JSON

Это делается при получении входных параметров, это может быть метод GetEntity или CreateEntity класса MPC_EXT. Когда мы говорим о создании заказа, вероятно, это будет CreateEntity, и там вы можете проанализировать структуру строки JSON и проверить ее. Анализ JSON выходит за рамки этого вопроса.

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

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

В шлюзе есть два основных типа исключений: /iwbep/cx_mgw_busi_exception и /iwbep/cx_mgw_tech_exception, но, поскольку мы хотим внедрить собственную логику, наш выбор - первый.

Общий подход к реализации обработки исключений:

IF json_invalid = abap_true.

DATA(lo_message_container) = me->mo_context->get_message_container( ).
lo_message_container->add_message( iv_msg_type = /iwbep/cl_cos_logger=>error
                                   iv_msg_number = '100'
                                   iv_msg_id = 'ZJSO'
                                   iv_add_to_response_header = abap_true
                                 ).

RAISE EXCEPTION TYPE /iwbep/cx_mgw_busi_exception
 EXPORTING
  message_container = lo_message_container.

Важно: не пропустите параметр iv_add_to_response_header = abap_true при добавлении сообщения, таким образом вы сможете читать сообщения об ошибках прямо в ответ, не просматривая логи.

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

lo_message->add_messages_from_bapi( it_bapi_messages = lt_return_msg ).

он использует эту точную структуру BAPIRET2, полученную в результате создания вашего заказа BAPI.

Наконец, после того, как все сделано, стоит отследить полезную нагрузку через /IWFND/TRACE, чтобы проверить, какая полезная нагрузка поступает во внешний интерфейс.

person Suncatcher    schedule 17.06.2020