Недавно я настраивал интеграцию одного сервиса, где из SAP необходимо было передать набор полей, часть из которых были необязательны к заполнению. На стороне ABAP использовался класс, сгенерированный на основе WSDL поставщика. До определенного момента все работало хорошо. Проблемы начались, когда потребовалось передать в опциональном параметре значение по умолчанию (INITIAL). В этом случае сгенерированная полезная нагрузка не содержала нужных тегов в окончательном XML-документе. Из-за отсутствия тэгов, сервер возвращал ошибку передачи данных.
Если вы использовали PROXY сервисы, то вероятно замечали, каждая сгенерированная структура содержит поле CONTROLLER типа PRXCTRLTAB. Поле CONTROLLER в большинстве случаев не используется, за исключением когда необходима явная настройка обработки значений по умолчанию.
Структура таблицы CONTROLLER заполняется следующим образом:
- В поле FIELD указывается имя поля для обработки
- В поле VALUE указывается режим обработки
Значения для VALUE определены в группе типов SAI
- SAI_CTRL_INITIAL — отправляет значение по умолчанию
- SAI_CTRL_NIL — передает тэг с атрибутом xsi:nil=’true’
- SAI_CTRL_NONE — не передает тэг
Перед отправкой данных, в сервисе необходимо активировать расширенную обработку XML. Для этого, в протоколе полезной нагрузки IF_WSPROTOCOL_PAYLOAD необходимо передать ABAP_TRUE в метод GET_EXTENDED_XML_HANDLING.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
DATA lo_proxy TYPE REF TO zcl_outbound_service. DATA lo_payload_protocol TYPE REF TO if_wsprotocol_payload. DATA ls_in TYPE zsoutbound_service_input. DATA ls_out TYPE zsoutbound_service_output. DATA ls_controller TYPE prxctrl. lo_payload_protocol ?= lo_proxy->get_protocol( if_wsprotocol=>payload ). lo_payload_protocol->set_extended_xml_handling( abap_true ). ls_controller-field = 'AMOUNT'. ls_controller-value = sai_ctrl_initial. " Отправка INITIAL APPEND ls_controller TO ls_in-controller. ls_controller-field = 'QUANTITY'. ls_controller-value = sai_ctrl_initial. " Отправка INITIAL APPEND ls_controller TO ls_in-controller. CALL METHOD lo_proxy->send EXPORTING request = ls_in IMPORTING response = ls_out. |
Справка от SAP: Activating Extended XML Handling
Присоединиться к обсуждению...