// //

3 opciones para consumir WebService desde Gateway

Resulta que tengo la URL (wsdl) de un WS (Este web service se ha realizado con JAVA) y quiero consumir dicho servicio en SAP GATEWAY

He estado buscando posibles opciones para su consumo y he encontrado varias soluciones:

OPCIÓN 1

Usar método lo_http_client para llamar al WSDL:
  1. ir a la transacción SOAMANAGER
  2. Después de logarte, ves a la segunda pestaña (Business Administration)
  3. Pinchar en link Web Service Administration
  4. Para buscar el proxy que ya has definido en la SE80, puedes poner en search by "Cosumer proxy" y en el search pattern algo así como Z*currency_convert y das al "go"
  5. Seleccionas en la primera columna tu proxy y pinchas en botón "Apply selection"
  6. Por defecto aparece seleccionada abajo la pestaña "Overview". Vas a la segunda pestaña Configurations.
  7. Pulsa botón "Create logic port"
  8. Pon el nombre de tu puerta lógica, por ejemplo: ZLP_Currency_convert y pincha por defecto "Logic port y default" porque luego en el código te va a facilitar la vida porque no te hará falta recordar el nombre que le habías dado. Asegurate de tener pinchado WSDL based configuration, Via HTTP Access y pon la url que te han pasado (acabada en ?wsdl)
  9. Si todo está bien se creará una puerta lógica.
  10. En tu código debes definir una data lv_lp type ref to "nombre de ws"
  11. créate object lv_lp (entre try end try). Si no le hubieras puesto puerta lógica por defecto ahora le tendrías que pasar al constructor el nombre de tu puerta lógica entre comillas.
  12. Para usar el proxy (invocar al ws externo) solo debes ahora hacer un call method a lv_lp->"método del ws" (Recuerda haber creado los parámetros input y output para el call method)




OPCIÓN 2

Creando una clase pública con la superclase CL_PROXY_CLIENT.
Esta opción no la he investigado a fondo.

OPCIÓN 3

Creando un Service Consumer (cliente proxy): Esta opción la he probado y funciona siguiendo estos pasos: "Consume a Web Service using ABAP and SE80"

Duda acerca de esta opción: En el paso de crear un puerto Logico, nos dice que pongamos como "logical port" uno definido por nosotros o introducir "CURR_CONV_XMETHODS" por defecto. En mi caso he introducido "CURR_CONV_XMETHODS" y todo ok....mi duda es si se puede usar este puerto lógico para cualquier caso o es mejor crear uno personalizado.


La idea es saber cual sería la opción recomendada y también saber un poco más acerca de la duda del Puerto Lógico (si se puede usar uno por defecto o crear uno personalizado).

Esta consulta se planteó en este debate de la comunidad de Ayuda SAP en español.

Para concluir, en este caso el Dpto. de Ingeniería creó la Puerta Lógica y, gracias a los consejos brindados en la comunidad de Ayuda SAP, todo ha ido sobre ruedas, jeje.

SAP Gateway

Comparto los datos seguidos en SAP Gateway:

  • Creación de un Cliente Proxy (Service Consumer): Tx: SPROXY -> New Object -> Service Consumer...
  • Creación de puerta Lógica para cliente Proxy: Tx: SOAMANAGER -> Web Service Configuration:
    • Buscamos nuestro Cliente Proxy y pulsamos sobre él.
    • Creamos puerta lógica, con los siguientes datos:
      • El nombre del Proxy: "nombreElegidoClienteProxy"
      • El nombre del puerto que hay que añadir: "ZLP_NOMBRE_PUERTO"
      • La descripción del puerto: "descripcion"
      • El sistema: "sistema_gateway"
      • La URL: "URL del servicio terminado en ?wsdl"
      • Puerto por defecto (Si/No): Si
    • Implementación del codigo en proyecto Gateway: En mi caso, al tratarse de una llamada a un servicio web externo (Gateway sirve de conexion puente entre aplicación SAPUI5 y componente EJB JAVA) he implementado la llamada al Web Service en una "Function Import".

OBSERVACIONES:
Entrando un poco en detalles técnicos de Gateway, al ser una "function import", se ejecuta el método /IWBEP/IF_MGW_APPL_SRV_RUNTIME~EXECUTE_ACTION de la clase NOMBRE_CLASE_DPC_EXT.
Dentro de este método tengo implementada la lógica y funcionalidad.

Código resumido

DATA: 

proxy           TYPE REF TO " Nombre de proxy creado"

p_port          TYPE prx_logical_port_name VALUE 'Puerto logico"

lw_input        TYPE "Parametro entrada WS" (EN CASO DE TENER)

lw_output       TYPE "Parametro salida WS"  (EN CASO DE TENER)



Recogemos parametro de entrada de servicio invocado en Gateway (EN CASO DE TENER PARAMETROS DE ENTRADA)

READ TABLE it_parameter INTO ls_parameter WITH KEY name = "nombreParam".

IF sy-subrc = 0.
parametro_entrada_1 = ls_parameter-value.
ENDIF.


Creamos instancia de proxy

TRY.
CREATE OBJECT proxy
EXPORTING
logical_port_name = p_port.
CATCH cx_ai_system_fault.
lv_msg_error = 'MENSAJE_ERROR'.
ENDTRY.

Preparamos parametro de entrada para llamada a Web Service (EN CASO DE TENER)
lw_input-parameters-.... = .....
*
* llamada al Web Service
*

TRY.
CALL METHOD proxy->"OPERACION_WEB_SERVICE"
EXPORTING
input = lw_input
IMPORTING
output = lw_output.


CATCH cx_ai_system_fault.
lv_msg_error = 'MENSAJE_ERROR.

ENDTRY.


Devolvemos resultados (EN CASO DE TENERLOS)

resultados = lw_output-.......

Bueno, a grandes rasgos creo que eso todo, =)
Espero que os pueda servir de ayuda.

0 comments:

Publicar un comentario

Nota Importante: los comentarios son para agradecer, comentar o sugerir cambios (o hacer preguntas) sobre el artículo de arriba.


SAP y el logotipo de SAP son marcas comerciales registradas de SAP AG en Alemania y en varios otros países. No estamos afiliados ni relacionados con ninguna división o subsidiaria de SAP AG.