
Sowohl auf Sender- als auch auf Empfänger-Seite kann es sinnvoll sein, auf die Payload zuzugreifen. 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).
Zugriff auf die Payload
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.
Abrufen der Payload nach einem Proxy-Aufruf
Um die Payload abzurufen, holen Sie sich zunächst eine Instanz zum Payload-Protokoll IF_WSPROTOCOL_PAYLOAD. Weitere Informationen finden Sie unter Protokolle.
Verwenden Sie folgende Methoden zum Abrufen der Payload nach dem Senden/Empfangen einer Message:
|
Methode |
Verwendbar in |
|---|---|
|
GET_SENT_REQUEST_PAYLOAD |
Client-Proxy und Server-Proxy |
|
GET_SENT_RESPONSE_PAYLOAD |
Consumer-Proxy |
|
GET_SENT_EXCEPTION_PAYLOAD |
Consumer-Proxy |
Abrufen der Payload unabhängig von einem Proxy-Aufruf
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 [Data Type of Output Parameter],
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 = '[Value1]'.
*...
request-fieldN = '[ValueN]'.
* 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-> ).