Можете ли вы вернуть конкретные ошибки из службы шлюза SAP?
У нас есть третья сторона, которая размещает заказы в нашей системе через полезную нагрузку JSON в сервисе шлюза SAP.
Структура службы шлюза содержит структуру данных, ожидаемых в JSON.
Из службы шлюза вызывается функция ABAP, которая принимает полезные данные и создает заказ.
У нас есть определенный уровень обработки ошибок на стороне ABAP, но если есть ЛЮБАЯ проблема с форматом JSON, общая ошибка 500 возвращается непосредственно из SAP Gateway, даже не попадая в ABAP.
Возникает вопрос: есть ли способ вернуть конечному пользователю конкретную ошибку JSON?
1 ответ
Во-первых, основной журнал GW находится в /IWFND/ERROR_LOG
tcode. Он содержит как системные, так и настраиваемые ошибки шлюза, и выглядит так:
Общий подход к ведению журнала ошибок в SAP Gateway:
- Поместите собственное сообщение об ошибке и вызовите бизнес-исключение в методе проверки параметров JSON
Это делается при получении входных параметров, это может быть GetEntity
или CreateEntity
метод класса MPC_EXT. Поскольку мы говорим о создании заказа, вероятно, это будетCreateEntity
, и там вы можете проанализировать структуру строки JSON и проверить ее. Анализ JSON выходит за рамки этого вопроса.
- При обнаружении ошибок будет запущено исключение, которое будет отображаться как в журнале, так и в консоли браузера.
В шлюзе есть два основных типа исключений: /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
чтобы проверить, какая полезная нагрузка поступает в интерфейс.