Cookbook: XI 2.0 Inboundproxy

Posten Sie hier Tutorials & Cookbooks.

Cookbook: XI 2.0 Inboundproxy

Postby Emre397 » Mon May 16, 2005 7:37 pm

Folgender Guide soll die Welt des XI - genauer die Inbound Proxys der an XI angeschlossenen Systeme - etwas näher bringen. Das am Ende dieses Beitrages angehängte Coding simuliert einen Proxyaufruf vergleichbar mit dem Testreport SPRX_TEST_INBOUND. Der Vorteil dieses Reports ist jedoch, daß man die Möchkeit hat alle Eingaben im Vorraus zu definieren. Sodaß ein beherzter click auf den 'ausführen? Button reicht um die XML seiner Wahl in das System zu jagen.

Meine Intension dahinter war einfach die Tatsache, daß ich es Leid war bei der Implementierung eines Inboundproxys immer die gleichen Angaben in der SPRX_TEST_INBOUND machen zu müssen (auch eine Variante anzulegen war mir zu - naja). Zudem mußte ich damals andauernd in den Debugger springen und das Sendende System setzten (diese Funktion wird von dem Standardtestreport nicht unterstützt) Und wie es sich für einen Programmierer gehört ist dann folgender Report dabei herausgekommen.

Der Report gliedert sich im Grunde in vier Teile.
1. XML-String erstellen
Per concatenate wird hier das XML zusammengebastelt. Als Vorlage diente mir ein Original aus der SXMB_MONI. Gewisse Platzhalter lassen auch eine Generik zu. z.B. wie folgt:

Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1. CONCATENATE l_xml_string '<ns1:Vorname>' lv_name '</Vorname>' INTO l_xml_string.
GeSHi ©


Der konkatinierte String muß nun in einen RAW string umgewandelt werden. Am einfachsten geht das mittels folgender Klasse CL_ABAP_CONV_OUT_CE.

2. XML 2 ABAP Mapper
Im zweiten Schritt kommt der XML 2 ABAP mapper. Die Daten liegen derzeit ja im XML-Format vor. Innerhalb eines Proxies sind diese jedoch in einer generierten komplexen Struktur. Gemapped wird das ganze durch generiertes XSLT Mapping. Wie das Mapping aussehen soll zieht wird über das IFR ermittelt. Dazu ist es notwendig Namespace und Interface das aufgerufen werden soll zu nennen:

Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1. * Namespace des empfangenden Interfaces
  2. lv_receiver-interface-namespace = 'XYZ_interface_namespace'.
  3. * Empfangendes interface
  4. lv_receiver-interface-name = 'XYZ_interface_name'.
GeSHi ©

Entegen der sonst allgemeingltigen ABAP Zeichenkettenpolitik muß man hier die kompletten Namen nicht in Großbuchstaben schreiben, da diese Informationen vom IFR kommen und da dies Java ist wird nicht so auf Groß/Kleinschreibung geachtet.

Mit folgender Zeile werden die informationen über den Proxy gezogen:
Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1. lo_registry = cl_proxy_inbound_registry=>create_from_ifr_name&#40; p_interface  = lv_receiver-interface &#41;.
GeSHi ©


Danach wird das passende XSLT gesucht:
Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1. lo_xslt = cl_proxy_stylesheet_runtime=>create_from_method
GeSHi ©

Existiert kein Mapping (z.B. beim Erstaufruf), dann wird schnell eins generiert:
Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1. lo_xslt->generate&#40; &#41;.
GeSHi ©


Nicht wundern, wenn das Mapping in der SE80 bei euren lokalen Objekten auftaucht - Das XSLT scheint immer bei dem User zu liegen der als erster die Codingzeilen durchläuft.

Danach wird aus den Interfacedaten noch die ABAPStruktur initialisiert. Und letztendlich wird Mapping mittels CALL TRANSFORMATION durchgeführt.

3. Senderparty festlegen
Das ist der Punkt, an dem SPRX_TEST_INBOUND nicht mithalten kann *g* Im Grunde werden hier die Daten für den Proxy vorbereitet. Das Object lo_controller bekommt die XML Nachricht und das Business System zugeschoben (hier wird der SLD name des Businessystems verwendet). Die Tabelle lt_parameters enthält dann die Parameter für den Proxy selbst.

4. Proxy aufrufen
Im letzten Schritt wird dann der Proxy gerufen. Proxytypisch komplett dynamisch ;):
Zuerst den methoden namen zusammenbasteln:
Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1.         CONCATENATE lo_registry->object_name lo_registry->object_name1 INTO l_method SEPARATED BY '~'.
GeSHi ©

und dann den dynamischen call mit unserer parametertabelle:
Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1.         CALL METHOD &#40;lo_registry->implementing_class&#41;=>&#40;l_method&#41;
  2.           PARAMETER-TABLE
  3.             lt_parameters.
GeSHi ©

Der Rest ist Errorhandling. Um so allgmein wie möglich zu bleiben fange ich hier alle Fehler zu zur cx_root Fehlerklasse ab.

Eine Letzte Anmerkung habe ich noch: Ihr solltet euch nicht wundern, wenn dieser Report keine Eintrag in der SXMB_MONI hinterlässt. Ich hab mich hier nur auf das wesentliche beschränkt ;)

Viel Spaß noch!

Gruß Azreal

Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1. DATA: lv_error TYPE string VALUE 'success ;&#41;'.
  2.  
  3. DATA: lo_exception TYPE REF TO cx_root.
  4.  
  5. DATA: l_conv         TYPE REF TO cl_abap_conv_out_ce,
  6.       l_xml_string   TYPE string,
  7.       l_xml_xstring  TYPE xstring.
  8.  
  9. ***************** 1. * XML-String erstellen **************
  10. CONCATENATE l_xml_string '<?xml version="1.0" encoding="utf-8"?>' INTO l_xml_string.
  11. CONCATENATE l_xml_string '<ns1:XYZ xmlns:ns1="http://..." xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">' INTO l_xml_string.
  12. CONCATENATE l_xml_string '</ns1:XYZ>' INTO l_xml_string.
  13.  
  14. * XML-String in raw mappen
  15. l_conv = cl_abap_conv_out_ce=>create&#40; encoding = 'UTF-8' &#41;.
  16. l_conv->write&#40; data = l_xml_string &#41;.
  17. l_xml_xstring = l_conv->get_buffer&#40; &#41;.
  18.  
  19. ***************** 2. * XML 2 ABAP Mapper **************
  20. DATA: lt_send_bindings TYPE abap_trans_resbind_tab,
  21.       ls_binding       TYPE abap_trans_resbind,
  22.       ls_parameter     TYPE abap_parmbind,
  23.       lt_parameters    TYPE abap_parmbind_tab.
  24.  
  25. TYPES: BEGIN OF rmdata,
  26.          bindings TYPE abap_trans_resbind_tab,
  27.          stylesheet TYPE cxsltdesc,
  28.        END OF rmdata.
  29.  
  30. DATA: ls_rmdata    TYPE rmdata,
  31.       lt_signature TYPE sproxsigtt,
  32.       lo_xslt      TYPE REF TO cl_proxy_stylesheet_runtime,
  33.       lo_registry  TYPE REF TO cl_proxy_inbound_registry,
  34.       lv_receiver TYPE prx_srvc.
  35.  
  36. FIELD-SYMBOLS: <sig> TYPE sproxsig.
  37.  
  38. * Namespace des empfangenden Interfaces
  39. lv_receiver-interface-namespace = 'XYZ_interface_namespace'.
  40. * Empfangendes interface
  41. lv_receiver-interface-name = 'XYZ_interface_name'.
  42.  
  43.     TRY.
  44. * Registry object interface aus repository ziehen.
  45.         lo_registry = cl_proxy_inbound_registry=>create_from_ifr_name&#40; p_interface  = lv_receiver-interface &#41;.
  46.  
  47. * Stylesheet vom Proxy ziehen.
  48.         lo_xslt = cl_proxy_stylesheet_runtime=>create_from_method&#40;
  49.                              p_object   = lo_registry->object
  50.                              p_obj_name = lo_registry->object_name
  51.                              p_method   = lo_registry->object_name1
  52.                              p_extended_xml_handling = ''&#41;.
  53.         IF lo_xslt->check_timestamp&#40; &#41; = ''.
  54. * ABAP 2 XML mapping generieren
  55.           lo_xslt->generate&#40; &#41;.
  56.         ENDIF.
  57.         ls_rmdata-stylesheet = lo_xslt->abap2xml_name.
  58.  
  59. * initialisieren der ABAP Struktur
  60.         lt_signature = lo_xslt->get_signature&#40; &#41;.
  61.         LOOP AT lt_signature ASSIGNING <sig>.
  62.           ls_binding-name     = <sig>-param.
  63.           CREATE DATA ls_binding-value TYPE &#40;<sig>-typename&#41;.
  64.           IF <sig>-decl = sprox_const_dir_importing.
  65.             APPEND ls_binding TO lt_send_bindings.
  66.           ELSEIF <sig>-decl = sprox_const_dir_exporting.
  67.             APPEND ls_binding TO ls_rmdata-bindings.
  68.           ELSEIF <sig>-decl = sprox_const_dir_changing.
  69.             APPEND ls_binding TO lt_send_bindings.
  70.             APPEND ls_binding TO ls_rmdata-bindings.
  71.           ENDIF.
  72.           ls_parameter-name  = <sig>-param.
  73.           ls_parameter-value = ls_binding-value.
  74.           INSERT ls_parameter INTO TABLE lt_parameters.
  75.         ENDLOOP.
  76.  
  77. * XML auf ABAP mappen
  78.         CALL TRANSFORMATION &#40;lo_xslt->xml2abap_name&#41;
  79.                               SOURCE XML l_xml_xstring
  80.                               RESULT &#40;lt_send_bindings&#41;.
  81.       CATCH cx_root.
  82.         lv_error = 'Unable to transform XML'.
  83.     ENDTRY.
  84.  
  85. ***************** 3. * Senderparty festlegen **************
  86.     TRY.
  87.         DATA: lo_controller  TYPE REF TO if_ai_proxy_controller.
  88.         CLASS cl_ai_factory DEFINITION LOAD.
  89.         CLASS cl_ai_posting_controller DEFINITION LOAD.
  90.         lo_controller = cl_ai_posting_controller=>create_controller&#40; &#41;.
  91. *   XML anh&#15207;en
  92.         lo_controller->set_input_payload&#40; l_xml_xstring &#41;.
  93. *   Name des empfangenden Systems setzten
  94. *    Empf&#15207;ersystem festlegen &#40;SLD_NAME&#41;
  95.             lv_receiver-bsn_system = 'SLD_NAME'.
  96.         lo_controller->set_sender_service&#40; lv_receiver &#41;.
  97.  
  98. *   Controller in parameterliste hinzufügen
  99.         DATA: lo_appl_controller   TYPE REF TO if_ai_posting_controller.
  100.         ls_parameter-name = 'CONTROLLER'.
  101.         lo_appl_controller ?= lo_controller.
  102.         GET REFERENCE OF lo_appl_controller INTO ls_parameter-value.
  103.         INSERT ls_parameter INTO TABLE lt_parameters.
  104.       CATCH cx_root.
  105.         lv_error = 'Unable to fill controller'.
  106.     ENDTRY.
  107. ***************** 4. * Proxy aufrufen **************
  108.     TRY.
  109.  
  110.         DATA: l_method TYPE string.
  111. * Proxy aufrufen
  112.         CONCATENATE lo_registry->object_name lo_registry->object_name1 INTO l_method SEPARATED BY '~'.
  113.         CALL METHOD &#40;lo_registry->implementing_class&#41;=>&#40;l_method&#41;
  114.           PARAMETER-TABLE
  115.             lt_parameters.
  116.  
  117.  
  118.       CATCH cx_root INTO lo_exception.
  119. * Problem bei der Verarbeitung:...
  120.         DATA: lv_order_fault TYPE REF TO cx_sus_order_fault.
  121.         DATA: lv_fult TYPE REF TO cx_sy_no_handler.
  122.         DATA: test TYPE REF TO cx_root.
  123.  
  124.         FIELD-SYMBOLS: <lv_test> TYPE REF TO cx_root.
  125.         ASSIGN lo_exception->previous TO <lv_test>.
  126.  
  127.         lv_order_fault ?= <lv_test>.
  128.         lv_error = lv_order_fault->standard-fault_text.
  129.  
  130.     ENDTRY.
  131.   CATCH cx_root.
  132.  
  133. WRITE: lv_error.
GeSHi ©
Emre397
...
...
 
Posts: 141
Joined: Mon Dec 09, 2002 1:53 pm

Re: Cookbook: XI 2.0 Inboundproxy

Postby Collin3323 » Thu Apr 22, 2010 11:26 am

Hy!
Ja, es ist ein possibelity, dass "Meine Intension dahinter war einfach die Tatsache, dass es mir leid tat, wenn die Durchführung einer Inboundproxys immer die gleichen Informationen in der SPRX_TEST_INBOUND (eine Version zu schaffen machen, war zu - gut). Ich hatte auch ständig dann direkt in den Debugger und setzen Sie das sendende System (dieses Feature wird nicht von den Standard-Test-Bericht unterstützt) und wie es für einen Programmierer gehört, daraus wird der folgende Bericht. "


Azreal hat geschrieben:Folgender Guide soll die Welt des XI - genauer die Inbound Proxys der an XI angeschlossenen Systeme - etwas näher bringen. Das am


***************** 3. * Senderparty festlegen **************
TRY.
DATA: lo_controller TYPE REF TO if_ai_proxy_controller.
CLASS cl_ai_factory DEFINITION LOAD.
CLASS cl_ai_posting_controller DEFINITION LOAD.
lo_controller = cl_ai_posting_controller=>create_controller( ).
* XML anh㭧en
lo_controller->set_input_payload( l_xml_xstring ).
* Name des empfangenden Systems setzten
* Empf㭧ersystem festlegen (SLD_NAME)
lv_receiver-bsn_system = 'SLD_NAME'.
lo_controller->set_sender_service( lv_receiver ).

* Controller in parameterliste hinzufügen
DATA: lo_appl_controller TYPE REF TO if_ai_posting_controller.
ls_parameter-name = 'CONTROLLER'.
lo_appl_controller ?= lo_controller.
GET REFERENCE OF lo_appl_controller INTO ls_parameter-value.
INSERT ls_parameter INTO TABLE lt_parameters.
CATCH cx_root.
lv_error = 'Unable to fill controller'.
ENDTRY.
***************** 4. * Proxy aufrufen **************
TRY.

DATA: l_method TYPE string.
* Proxy aufrufen
CONCATENATE lo_registry->object_name lo_registry->object_name1 INTO l_method SEPARATED BY '~'.
CALL METHOD (lo_registry->implementing_class)=>(l_method)
PARAMETER-TABLE
lt_parameters.


CATCH cx_root INTO lo_exception.
* Problem bei der Verarbeitung:...
DATA: lv_order_fault TYPE REF TO cx_sus_order_fault.
DATA: lv_fult TYPE REF TO cx_sy_no_handler.
DATA: test TYPE REF TO cx_root.

FIELD-SYMBOLS: <lv_test> TYPE REF TO cx_root.
ASSIGN lo_exception->previous TO <lv_test>.

lv_order_fault ?= <lv_test>.
lv_error = lv_order_fault->standard-fault_text.

ENDTRY.
CATCH cx_root.
ENDTRY.

WRITE: lv_error.[/code]



-----------------------

Preisvergleich, um die beste Angebot.
Collin3323
.
.
 
Posts: 5
Joined: Wed Apr 21, 2010 10:04 am


Return to Tutorials & Cookbooks

Who is online

Users browsing this forum: No registered users and 1 guest

cron