Sowohl auf Sender- als auch auf Empfänger-Seite kann es Sinn machen, dass man auf die Payload zugreifen möchte. Es gibt zwei Fälle zu unterscheiden:
● Sie brauchen die Payload erst nach dem Versenden oder bei Empfang der Message (etwa um die gesendete Message zu archivieren).
● Sie müssen schon vor dem Versenden der Message wissen, wie die Payload aussieht (beispielsweise für die XI-Laufzeit, etwa weil Sie eine Vorab-Empfängerermittlung durchführen, bei der der Empfänger von Daten in der Payload abhängt).
Alle hier beschriebenen Methoden geben die Payload als Objekt vom Typ IF_WS_PAYLOAD zurück. Mit Hilfe der Methoden dieses Objekts können Sie auf die Payload zugreifen.
Um die Payload abzurufen, holen Sie sich zuerst eine Instanz zum Payload-Protokoll IF_WSPROTOCOL_PAYLOAD. Verwenden Sie folgende Methoden:
Methoden zum Abrufen der Payload nach dem Senden/bei Empfang einer Message
Methode |
Verwendbar in |
GET_SENT_REQUEST_PAYLOAD |
Consumer-Proxy und Provider-Proxy |
GET_SENT_RESPONSE_PAYLOAD |
Consumer-Proxy |
GET_SENT_EXCEPTION_PAYLOAD |
Consumer-Proxy |
Die Methode GET_PAYLOAD_HANDLER des Payload-Protokolls gibt einen Payload-Handler (Objekt vom Typ REF TO IF_WS_PAYLOAD_HANDLER) zurück. Mit diesem Handler können Sie die Payload zu einer Request-, Response- oder Fault-Message erzeugen (Rendering) oder parsen.
Den Handler können Sie sich auch über die Methode GET_PAYLOAD_HANDLER der Klasse CL_PROXY_ACCESS der ABAP-Proxy-Laufzeit unabhängig von einer Proxy-Instanz besorgen. Dann müssen Sie zusätzlich den Klassennamen des Proxies und die Proxy-Methode angeben. Der Parameter EXTENDED_XML_HANDLING dieser Methode bestimmt, ob für alle Methoden des Payload-Handlers das erweiterte XML-Handling aktiv sein soll.
Die folgenden Methoden des Payload-Handlers werden auch intern von der ABAP-Proxy-Laufzeit verwendet:
Methoden von IF_WS_PAYLOAD_HANDLER
Methode |
Verwendung |
GET_PAYLOAD_FROM_REQUEST_DATA |
Erzeugt eine Payload für Request-Daten eines Proxy (Rendering). |
GET_PAYLOAD_FROM_RESPONSE_DATA |
Erzeugt eine Payload für Response-Daten eines Proxy (Rendering). |
GET_PAYLOAD_FROM_EXCEPTION |
Gibt eine Fault-Message ausgehend von einer Instanz einer Ausnahmeklasse zurück (Rendering). |
GET_REQUEST_DATA_FROM_PAYLOAD |
Parsen einer Request-Message-Payload, um sich die Request-Daten zurückgeben zu lassen. |
GET_RESPONSE_DATA_FROM_PAYLOAD |
Parsen einer Response-Message-Payload, um sich die Response-Daten zurückgeben zu lassen. |
GET_EXCEPTION_FROM_PAYLOAD |
Parsen einer Fault-Message-Payload, um sich eine Instanz der zugehörigen Ausnahmeklasse zurückgeben zu lassen. |
Das folgende Programm holt sich unabhängig von einer Proxy-Instanz die Payload zu einer Request-Message und gibt sie im System aus:
DATA:
ls_request TYPE
[Datentyp des
Output-Parameters],
lo_fault TYPE
REF TO cx_ai_system_fault,
lo_payload_handler TYPE REF TO
IF_WS_PAYLOAD_HANDLER,
lo_payload TYPE
REF TO if_ws_payload,
lt_request_data TYPE PRX_T_PARAM,
ls_request_data TYPE PRX_S_PARAM.
lo_pointer TYPE
REF TO xstring,
* Fill request data
request-field1 =
'[Wert1]'.
request-field1 = '[Wert1]'.
*...
request-fieldN = '[WertN]'.
* Use payload
handler to get payload independently
* from proxy call:
TRY.
* Get Payload
handler for a proxy method.
* Note: You have to provide the proxy and method name in uppercase.
lo_payload_handler
= cl_proxy_access=>get_payload_handler(
proxy_name = 'CO_...'
proxy_method = 'EXECUTE_SYNCHRONOUS'
).
* Pass request data to payload handler
CLEAR
lt_request_data.
CLEAR ls_request_data.
ls_request_data-name = 'OUTPUT'.
GET REFERENCE OF request into ls_request_data-value.
append ls_request_data to lt_request_data.
lo_payload =
lo_payload_handler->get_payload_from_request_data(
lt_request_data).
* Catch system faults
CATCH cx_ai_system_fault
INTO lo_fault.
WRITE: / 'System fault'.
WRITE: / 'Code:', lo_fault->code.
WRITE: / 'Text:', lo_fault->errortext.
EXIT.
ENDTRY.
* Show payload for test purposes
lo_pointer =
lo_payload->get_xml_pointer( ).
cl_proxy_service=>show_xml_document( lo_pointer->* ).