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

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

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

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

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

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

1 ответ

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

Общий подход к ведению журнала ошибок в 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 чтобы проверить, какая полезная нагрузка поступает в интерфейс.

Другие вопросы по тегам